Rust 使用闭包从选项获取原始指针是否安全<&;T>;?
我有一个Rust 使用闭包从选项获取原始指针是否安全<&;T>;?,rust,Rust,我有一个选项,我希望有一个原始*常量,如果该选项为无,则该值为空。我想包装一个FFI调用,该调用使用指向已分配对象的指针 此外,我使用的FFI接口具有借用语义(我分配一些东西并传入指向它的指针),而不是所有权语义 extern“C”{ //参数可能为空 fn ffi_呼叫(*const T); } fn安全包装(选项:选项){ 设ptr:*常数T=???; 不安全{ffi_call(ptr)} } 我可以使用match语句来实现这一点,但该方法感觉非常冗长 让ptr=match opt{ 一些
选项
,我希望有一个原始*常量
,如果该选项为无
,则该值为空。我想包装一个FFI调用,该调用使用指向已分配对象的指针
此外,我使用的FFI接口具有借用语义(我分配一些东西并传入指向它的指针),而不是所有权语义
extern“C”{
//参数可能为空
fn ffi_呼叫(*const T);
}
fn安全包装(选项:选项){
设ptr:*常数T=???;
不安全{ffi_call(ptr)}
}
我可以使用match
语句来实现这一点,但该方法感觉非常冗长
让ptr=match opt{
一些(内部)=>内部为*const T,
None=>null(),
};
我还可以将引用映射到指针,然后使用unwrap\u或
让ptr=opt.map(| inner | inner as*const T).unwrap_或(null());
但是,我担心指针在通过闭包时可能会失效。Rust是否保证最终指针将指向与原始引用相同的对象?如果
T
是Copy
,这会有意义地改变语义吗?有没有更好的方法可以让我忽略呢?是的,这是安全的。我会这样写:
use std::ptr;
fn safe_wrapper(opt: Option<&u8>) {
let p = opt.map_or_else(ptr::null, |x| x);
unsafe { ffi_call(p) }
}
此C函数借用了:
大小字符串长度(字符*)
两者都有一个指针。Rust通过清楚地描述什么是借款和什么是所有权转让来改善这种情况
这种代码是荒谬的;它没有定义泛型类型T
,FFI函数无论如何也不能有泛型类型。@Stargateur我最终将使用unsafe
通过指针操纵T
。此外,我使用的FFI接口具有借用语义(我分配一些东西并传递指向它的指针),而不是所有权语义,因此&
似乎是比Box
更好的选择。这个问题是关于构造指针的,这是一个安全的操作。我的主要问题是:如何确保生成的指针实际指向与引用相同的对象?
extern "C" {
// Parameter may be null
fn ffi_call(*const T);
}