Нужен ли мне тип R c для хранения указателя на структуру Rust внутри его члена C struct - PullRequest
0 голосов
/ 17 июня 2020

Я хотел бы сохранить указатель на ржавчину 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.

1 Ответ

0 голосов
/ 18 июня 2020

E_net4 все время переименовывается. * Комментарий 1002 * отвечает на мой вопрос -

используйте R c только в том случае, если вам нужно совместное владение в коде Rust. Поскольку C не сохраняет семантику этого типа указателя, код C должен обрабатывать границы вручную независимо от того,

...