如何将值的所有权从 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_ptrrelease 方法来实现。 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 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Rust中的函数堆栈上放置C结构?

使用数组参数从 C 调用 Rust 方法

抓狂!当 Rust 从 C FFI 调用时,没有产生线程

算法学习1769. 移动所有球到每个盒子所需的最小操作数(java / c / c++ / python / go / rust)

如何将值的“数组”传递给我的存储过程?

如何在不使用 C++/C 中的阻塞函数的情况下将值从线程返回到主函数