为什么在 rust 中投放vec之前要投放元素

fruv7luv  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(100)

我正在尝试实现一个向量。我发现这段代码中的作者释放了一个向量:

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函数将清除内存中的整个序列,为什么还要在第四行逐步删除所有元素?
这个向量是否存储指针,这些元素是否写在随机位置?分别删除元素的目的是什么?

lmvvr0a8

lmvvr0a81#

考虑一个MyVec<String>,向量中的每个字符串都有自己单独的分配来保存字符串数据。
向量只能释放它分配给自己的内存,这些内存保存字符串对象,但不能保存字符串所保存的数据,因此它必须单独请求每个字符串释放额外的资源,而这正是drop所做的。

相关问题