Я хотел бы сохранить указатель на ржавчину struct
внутри его члена C struct. Требуется ли, чтобы структура была заключена в Rc
, а не в Box
? Причина, по которой я спрашиваю, заключается в том, что, хотя здесь существует совместное владение, к указателю всегда можно получить доступ только из unsafe
функций-членов структуры Rust, а время жизни структуры C привязано к времени жизни окружающей структуры Rust.
Вот пример ->
// C struct with constructor/destructor
struct c_foo {
void* internal; // pointer to rust `struct`
/* ... */
};
struct c_foo* c_foo_new();
void c_foo_free(struct c_foo* foo);
// FFI struct generated by bindgen
#[repr(C)]
#[derive(Debug, Copy)]
pub struct Foo {
pub internal: *mut libc::c_void, // pointer to rust `struct`
/* ... */
}
// Rust struct that wraps the FFI struct
struct Bar {
ptr: *mut Foo, // private
/* ... */
}
impl Bar {
fn new() -> Box<Bar> {
unsafe {
let mut bar = Box::new(Bar { ptr: c_foo_new() });
let bar_ptr: *mut ffi::c_void = &mut bar as *mut _ as *mut ffi::c_void;
(*bar.ptr).internal = bar_ptr;
bar
}
}
}
impl Drop for Bar {
fn drop(&mut self) {
unsafe {
c_foo_free((*bar.ptr).internal);
}
}
}
Итак, есть C struct c_foo
с void *
, которая хранит ссылку на структуру Rust Bar
. Foo
- это просто созданная bindgen оболочка Rust для c_foo
. Нужен ли мне Box
или Rc
в функции Bar::new()
?
Чтобы уточнить, на стороне Rust нет совместного владения. Существует совместное владение ч / б стороной Rust и C, поэтому я думаю, нет никакой пользы от использования типа Rc
.