如何从Rust将一个值的所有权转移给C代码?

9
我正在尝试使用FFI编写一些涉及C接管结构体所有权的Rust代码:
fn some_function() {
    let c = SomeStruct::new();
    unsafe {
        c_function(&mut c);
    }
}

我希望 c_function 接管 c 的所有权。在 C++ 中,可以通过 unique_ptrrelease 方法来实现这一点。Rust 中是否有类似的方法?

1个回答

15

std::unique_ptr类型在C++中对应于Rust中的Box类型,而.release()对应于Box::into_raw

let c = Box::new(SomeStruct::new());
unsafe {
    c_function(Box::into_raw(c));
}

请注意,C函数应该返回指向Rust的指针所有权以销毁结构。使用C的free或C++的delete释放内存是不正确的。

pub unsafe extern "C" fn delete_some_struct(ptr: *mut SomeStruct) {
    // Convert the pointer back into a Box and drop the Box.
    Box::from_raw(ptr);
}

std::unique_ptr有一个模板参数Deleter,默认为std::default_delete<T>。通过提供一个公开的Rust函数来执行删除操作可能会很方便。或者,您可以专门化std::default_delete,以便所有实例unique_ptr<RustType>都能正确地被释放。 - Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接