我想重新发明轮子(引用计数智能指针),但我不确定如何正确释放
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()
是否会起到同样的作用(如果不是更好的话),因为它不必制作一个盒子来扔掉它
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
的麻烦。