如何将值的所有权转移到Rust的C代码?

时间:2017-03-01 04:41:53

标签: rust ffi ownership

我正在尝试用FFI编写一些Rust代码,其中涉及C获取结构的所有权:

fn some_function() {
    let c = SomeStruct::new();
    unsafe {
        c_function(&mut c);
    }
}

我希望c_function获得c的所有权。在C ++中,这可以通过release的{​​{1}}方法实现。 Rust中有类似的东西吗?

2 个答案:

答案 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);
    }
}

另见https://doc.rust-lang.org/book/raw-pointers.html