我在FFI库中工作,并且遇到过这种模式很多次,我不知道如何处理。
impl CanVoidStar for str {
fn as_cvoid_ptr(&self) -> *const c_void {
let string = CString::new(self).unwrap();
unsafe {
return mem::transmute(string.as_ptr());
}
}
}
我的目的是创建一个指向一块内存的const *void
指针,我可以将其移交给C函数。这里的问题是string
超出了范围,因此我在unsafe
块中得到了未定义的行为。
有没有一种方法可以在堆上分配string
,直到使用它完成的返回值为止?此外,是否有一种惯用的方法来处理这个问题,还是需要重新设计我的算法?
答案 0 :(得分:4)
您似乎在CString
上使用了错误的方法,CString::into_raw()
就是您想要的。更好的是,在你想再次释放内存之前,它不需要unsafe
代码。
当CString::as_ptr()
返回指向字符串的指针时,CString::into_raw()
将内存的所有权传递给原始指针;这仅适用于您的用例:
trait CanVoidStar {
fn as_cvoid_ptr(&self) -> *const c_void;
}
impl CanVoidStar for str {
fn as_cvoid_ptr(&self) -> *const c_void {
let string = CString::new(self).unwrap();
string.into_raw() as *const c_void
}
}
正如文档所述,如果您想要释放它,您需要使用CString::from_raw()
重建CString
,然后像往常一样将其删除。