如何将值的所有权从 Rust 转移到 C 代码?
Posted
技术标签:
【中文标题】如何将值的所有权从 Rust 转移到 C 代码?【英文标题】:How to transfer ownership of a value to C code from Rust? 【发布时间】:2017-07-20 06:51:53 【问题描述】:我正在尝试使用 FFI 编写一些 Rust 代码,其中涉及 C 获取结构的所有权:
fn some_function()
let c = SomeStruct::new();
unsafe
c_function(&mut c);
我希望c_function
拥有c
的所有权。在 C++ 中,这可以通过unqiue_ptr
的release
方法来实现。 Rust 中是否有类似的东西?
【问题讨论】:
【参考方案1】:C++ 中的 std::unique_ptr
类型对应于 Rust 中的 Box
和 .release()
corresponds to 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>
被正确释放。以上是关于如何将值的所有权从 Rust 转移到 C 代码?的主要内容,如果未能解决你的问题,请参考以下文章
算法学习1769. 移动所有球到每个盒子所需的最小操作数(java / c / c++ / python / go / rust)