如何将锈迹中的物品掉落

时间:2020-09-11 03:12:37

标签: memory-leaks 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,这不是一个可怕的主意,因为那将是十亿个无操作吗?我猜编译器应该足够聪明,可以执行死代码清除,所以也许我会成为过早优化的牺牲品。

1 个答案:

答案 0 :(得分:3)

在检查std::mem::needs_drop::<T>()的if语句中包装drop_in_place循环。