我正在尝试实现一个向量。我发现这段代码中的作者释放了一个向量:
impl<T> Drop for MyVec<T> {
fn drop(&mut self) {
if self.cap != 0 {
while let Some(_) = self.pop() { }
let layout = Layout::array::<T>(self.cap).unwrap();
unsafe {
alloc::dealloc(self.ptr.as_ptr() as *mut u8, layout);
}
}
}
}
既然知道这些元素是连续存储的,并且dealloc
函数将清除内存中的整个序列,为什么还要在第四行逐步删除所有元素?
这个向量是否存储指针,这些元素是否写在随机位置?分别删除元素的目的是什么?
1条答案
按热度按时间lmvvr0a81#
考虑一个
MyVec<String>
,向量中的每个字符串都有自己单独的分配来保存字符串数据。向量只能释放它分配给自己的内存,这些内存保存字符串对象,但不能保存字符串所保存的数据,因此它必须单独请求每个字符串释放额外的资源,而这正是
drop
所做的。