2016-09-02 3 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()은 메모리의 소유권을 원시 포인터로 전달합니다. 이 정확히 사용 사례를위한 것입니다 설명서를 말한다

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을 재구성 한 후 평소대로 떨어졌다 있어야합니다.

+0

이것은 내가 필요로하고 예상 한대로 정확하게 작동합니다. Chris에게 감사드립니다. – sholsapp

관련 문제