К сожалению, а может и к счастью, Rust не предоставляет возможности создать не управляемый объект в хипе. Так или иначе, объект будет управляться при помощи либо разделяемых, либо уникальных указателей. И в первом и во втором случаях, по входу последнего из указателей за пределы области видимости объект в памяти будет уничтожен. В довольно редких случаях, такое поведение не подходит. В качестве примера можно взять данные, передаваемые в качестве параметра для асинхронной функции в неуправляемую библиотеку.
Для решения подобной задачи остается только одно, выделить память при помощи malloc и не забыть освободить ее при помощи free. Ну и небольшой примерчик того, как облегчить себе жизнь.
unsafe fn mk_mem_obj_copy<T>(src: T) -> *T {
let size = sys::size_of::<T>();
let dst = libc::malloc(size);
libc::memcpy(dst, ptr::addr_of(src) as *libc::c_void, size);
ret dst as *T;
}
unsafe fn mk_mem_obj<T>() -> *T {
libc::malloc(sys::size_of::<T>()) as *T
}
unsafe fn mem_obj_free<T>(obj: *T) {
libc::free( obj as *libc::c_void );
}
let size = sys::size_of::<T>();
let dst = libc::malloc(size);
libc::memcpy(dst, ptr::addr_of(src) as *libc::c_void, size);
ret dst as *T;
}
unsafe fn mk_mem_obj<T>() -> *T {
libc::malloc(sys::size_of::<T>()) as *T
}
unsafe fn mem_obj_free<T>(obj: *T) {
libc::free( obj as *libc::c_void );
}
Правильное решение: https://doc.rust-lang.org/std/boxed/struct.Box.html#method.into_raw
Безусловно на данный момент это правильное решение! А еще более правильным решение будет смотреть на время заметки перед тем как постить “правильные решения”
А с чего вы взяли что Роман не посмотрел? Ценность его комментария о правильном
решении очевидна вне зависимости от того, что на момент поста этого решения не было.