我正在try 实现一个向量.我发现了这样一个代码,编写者在其中释放一个向量:

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函数将清除内存中的整个序列时,为什么要在第四行一步一步地删除这些元素?

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

推荐答案

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

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

Rust相关问答推荐

为什么迭代器上的`. map(...)`的返回类型如此复杂?

是否有可能同时避免不兼容的不透明类型和代码重复?

如何为utoipa中的可选查询参数生成OpenAPI模式?

如何为rust trait边界指定多种可能性

如何将单个 struct 实例与插入器一起传递到Rust中的映射

不能在Rust中使用OpenGL绘制三角形

考虑到Rust不允许多个可变引用,类似PyTorch的自动区分如何在Rust中工作?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

为什么 `Deref` 没有在 `Cell` 上实现?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

使用 pyo3 将 Rust 转换为 Python 自定义类型

如何强制匹配的返回类型为()?

为什么编译器看不到这个 `From` impl?

可以在旋转循环中调用try_recv()吗?

为什么 Rust 字符串没有短字符串优化 (SSO)?

Rust 编译器不统一在 if let 表达式的分支中都 impl Future 的类型

LinkedList::drain_filter::drop 中 DropGuard 的作用是什么?

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

Rust:如果我知道只有一个实例,那么将可变borrow 转换为指针并返回(以安抚borrow 判断器)是否安全?

为什么 Rust 中的关联类型需要明确的生命周期注释?