I wanted to reinvent the wheel(reference counting smart pointer) and i am not sure how to properly free the memory leaked with Box::into_raw()
, once the references go to zero i don’t know how to efficiently free the memory that is being pointed
I originally went with
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");
};
}
}
but i was wondering if ptr::drop_in_place()
would work the same if not better since it won’t have to make a Box just to drop it
>Solution :
As you can see from the documentation on into_raw
just drop_in_place
is not enough, to free the memory you also have to call 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>()); }
For performance considerations, both methods compile to the exact same instructions, so I’d just use drop(Box::from_raw(ptr))
to save me the hussle remembering the dealloc
where applicable.