如何在 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
循环
我有一个名为 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>()
.
drop_in_place
循环