为什么在 Rust 中应该先删除元素,然后再删除 vec

use*_*301 2 memory-management vector rust drop

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

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我知道这些元素是连续存储的并且该dealloc函数将清除内存中的整个序列时,为什么要在第四行逐步删除所有元素?

该向量是否存储指针并且这些元素是否写入随机位置?单独删除元素的目的是什么?

Seb*_*edl 6

想想一个MyVec<String>. 向量中的每个字符串都有自己单独的分配来保存字符串数据。

向量只能释放它自己分配的内存,该内存保存字符串对象,但不能释放字符串依次保存的数据。因此它必须单独要求每个字符串释放其额外资源,而这正是所做的drop