Hello,
currently I'm writing a small library that should be callable from C.
However I have a small understanding problem on how to "free" the memory afterwards.
at the moment I defined a Buffer for C like that:
pub struct Buffer {
pub data: *const u8,
pub len: usize,
}
The Buffer gets exported via a function like that:
#[no_mangle]
pub extern "C" fn extract_information(path: *mut c_char) -> Buffer
Do I know need a second function to clean the memory? I've read a lot of articles about *mut u8
however nothing about *const u8
.
The types *const
/*mut
specifically are not managed by Rust and it doesn't know how to free them.
However, you usually cast from and to Box
, which is managed and freed by Rust:
So you'd create another function free_information
that uses Box::from_raw
to convert a raw pointer to Box pointer (and then you don't have to free the box — Rust will do it automatically).
For an allocated array of bytes, you'd probably want Box<[u8]>
(it's simpler than Vec
, which also has capacity).
let slice = slice::from_raw_parts_mut(data, len);
let boxed_slice: Box<[u8]> = Box::from_raw(slice);
1 Like
ah well that's what I thought already (but good to have a confirmation for that). I think what I missed is that *const u8 and *mut u8 are "basically" the same, i.e. I can just call let ptr = value as *mut u8
or let ptr = value as *const u8
. (It's impossible to call from_raw_parts_mut
or from_raw
onto a *const u8
)
Yes, you can cast them at will. foo as *mut _
is a nice shortcut.
1 Like