rust ,我如何正确地释放堆分配内存?

c7rzv4ha  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(220)

我想重新发明轮子(引用计数智能指针),我不知道如何正确地释放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()是否会工作相同,如果不是更好,因为它将不必使一个盒子只是为了下降

6rqinv9w

6rqinv9w1#

正如您在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>());
}

出于性能考虑,这两种方法都是compile to the exact same instructions,所以我只使用drop(Box::from_raw(ptr))来保存记住dealloc的麻烦。

相关问题