如何在 Rust 中删除集合中的项目

How do I drop items in collections in rust

我有一个名为 arr 的小箱子,它是专门为大型固定大小的堆数组设计的(可以存储数十亿个元素)。我在理解为这个数组实现 Drop 的正确方法时遇到了问题。

pub struct Array<T> {
    size: usize,
    ptr: *mut T,
}

我原来的 Drop 是这样的:

impl<T> Drop for Array<T> {

    fn drop(&mut self) {
        let objsize = std::mem::size_of::<T>();
        let layout = Layout::from_size_align(self.size * objsize, 8).unwrap();

        unsafe {
            dealloc(self.ptr as *mut u8, layout);
        }
    }
}

然而 - 这显然是不对的,因为如果 T 是一个 Drop 那么我正在泄漏内存 - 一位好心的 github 成员向我指出了这一事实。但是我应该如何最好地释放这段内存呢?天真地我认为我可以遍历所有元素并对它们调用 std::ptr::drop_in_place:

for i in 0..(self.size as isize) {
    std::ptr::drop_in_place(self.ptr.wrapping_offset(i));
}

但是如果数组是十亿个 u8 这不是一个糟糕的想法,因为那将是十亿个空操作吗?我想编译器应该足够聪明,可以进行死代码省略,所以我可能会成为过早优化的牺牲品。

在检查 std::mem::needs_drop::<T>().

的 if 语句中包装您的 drop_in_place 循环