我正在尝试用FFI编写一些Rust代码,其中涉及C获取结构的所有权:
fn some_function() {
let c = SomeStruct::new();
unsafe {
c_function(&mut c);
}
}
我希望c_function
获得c
的所有权。在C ++中,这可以通过release
的{{1}}方法实现。 Rust中有类似的东西吗?
答案 0 :(得分:9)
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&#39 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);
}
答案 1 :(得分:-1)
基本上,C语言没有所有权功能。 C只有"通过值"和#34;通过指针"。 如果要将Rust结构的指针传递给C函数,则应执行以下操作:
fn some_function() {
let c = SomeStruct::new();
let ptr = &c as *mut c;
unsafe {
c_function(ptr);
}
}