Rust,FFI和字符串嬗变的生命周期

时间:2016-09-02 02:28:31

标签: rust ffi lifetime

我在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,直到使用它完成的返回值为止?此外,是否有一种惯用的方法来处理这个问题,还是需要重新设计我的算法?

1 个答案:

答案 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,然后像往常一样将其删除。