小编pga*_*kst的帖子

如何在 Rust 中获取 C 指针的所有权并适当地删除它?

我正在调用一个 C 构造函数keyNew,该函数为结构分配内存Key并将 a 返回*mut Key到 Rust 端。使用Box::from_raw包装指针并获取它的所有权是否合适?

我也可以直接返回原始指针,但这会导致 API 非常丑陋,而且对于 Rust 来说并不符合习惯。

我还想在 Key 上实现 Drop Trait,以便keyDel自动调用析构函数,这将是对 C 中手动调用的改进。在我看来,这是一个更好的 API。然而,实现 Drop Trait 要求不实现 Copy Trait,因此由于“移出取消引用的内容”,不再可能取消引用原始指针。

他们的密钥是由 rust-bindgen 生成的

#[repr(C)]
#[derive(Debug, Clone)]
pub struct Key {
    _unused: [u8; 0],
}
Run Code Online (Sandbox Code Playgroud)

的构造函数Key是这样实现的

fn new() -> Box<Key> {
    unsafe { Box::from_raw(keyNew(0 as *const i8)) }
}
Run Code Online (Sandbox Code Playgroud)

和析构函数

impl Drop for Key {
    fn drop(&mut self) {
        unsafe { keyDel(self) }; …
Run Code Online (Sandbox Code Playgroud)

c ffi ownership rust

6
推荐指数
1
解决办法
3134
查看次数

标签 统计

c ×1

ffi ×1

ownership ×1

rust ×1