gpt4 book ai didi

memory-leaks - 如何在 Rust 中丢弃集合中的项目

转载 作者:行者123 更新时间:2023-12-03 11:26:06 25 4
gpt4 key购买 nike

我有一个叫 arr 的小 crate 这是专门为大型固定大小的堆数组设计的(可以在其中存储数十亿个元素)。我在理解实现 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循环检查 if 语句 std::mem::needs_drop::<T>() .

关于memory-leaks - 如何在 Rust 中丢弃集合中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63840294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com