Rust,我如何正确释放堆分配的内存?

3

我想重新发明轮子(参考计数智能指针),但我不确定如何正确释放使用 Box::into_raw()泄漏的内存,一旦引用计数归零,我不知道如何有效地释放被指向的内存。

最初我尝试了

impl<T> Drop for SafePtr<T>{
    fn drop(&mut self) {
        //println!("drop, {} refs", self.get_refs());
        self.dec_refs();
        let ref_count = self.get_refs();
        if ref_count == 0usize{
            unsafe{
                let _ = Box::from_raw(self.ptr);
                let _ = Box::from_raw(self.refs);
            };
            println!("Dropped all pointed values");
        };
    }
}

但我在想,如果使用ptr::drop_in_place()是否可以达到同样的效果,甚至更好,因为它不需要创建一个Box再将其丢弃。

1个回答

4

into_raw的文档中可以看出,仅使用drop_in_place是不够的,为了释放内存,您还需要调用dealloc

use std::alloc::{dealloc, Layout};
use std::ptr;

let x = Box::new(String::from("Hello"));
let p = Box::into_raw(x);
unsafe {
    ptr::drop_in_place(p);
    dealloc(p as *mut u8, Layout::new::<String>());
}

基于性能考虑,两种方法编译成完全相同的指令,因此我只需使用drop(Box::from_raw(ptr))来避免在适用时记住dealloc带来的麻烦。


这正是我不确定的。谢谢帮助,我将坚持使用 drop(Box::from_raw(ptr))! - Eto on a mill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接