繁体   English   中英

如何在 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 ,这不是一个糟糕的主意,因为那将是十亿个空操作吗? 我猜编译器应该足够聪明,可以执行死代码省略,所以也许我会成为过早优化的牺牲品。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM