2016-09-02 5 views
0

私はFFIライブラリで作業していますが、このパターンはかなり頻繁に慣らされています。文字列変換のための錆、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()); 
     } 
    } 
} 

私の意図は、私はC関数に引き渡すことができ、メモリの一部にconst *voidポインタを作成することでした。ここではstringが範囲外になり、したがってunsafeブロックで未定義の動作が発生するという問題があります。

ヒープ上にstringを割り当てることができる方法はありますか?返された値を使用しているものは何ですか?さらに、これを処理するための慣用的な方法があるのでしょうか、アルゴリズムを再設計する必要がありますか?

+0

http://jakegoulding.com/rust-ffi-omnibus/ – Shepmaster

答えて

4

CStringで間違った方法を使用しているようですが、CString::into_raw()が必要です。さらにメモリを解放するまでは、unsafeコードは必要ありません。

CString::as_ptr()は文字列にポインタを返しますが、CString::into_raw()はメモリの所有権を生ポインタに渡します。ドキュメントはあなたが今までそれを解放したい場合、あなたはCString::from_raw()を使用してCStringを再構築し、それはいつものように落ちている必要があります、言うように

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 
    } 
} 

:これはまさにあなたのユースケースを対象としています。

+0

これは私が必要としていたもので、期待通りに動作します。 Chrisに感謝します。 – sholsapp

関連する問題