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

问题描述 投票:0回答:1

我想重新发明轮子(引用计数智能指针),但我不确定如何正确释放

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()
是否会起到同样的作用(如果不是更好的话),因为它不必制作一个盒子来扔掉它

pointers rust heap-memory
1个回答
5
投票

正如您从

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
的麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.