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