[英]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.