2015-01-22 5 views
9

필자의 경우는 매우 간단하다. 나는 C++ 애플리케이션과 Haskell 라이브러리를 가지고 있으며, 단지 C 문자열을 리턴하는 함수를 Haskell로부터 export 할 필요가있다.할당 된 메모리를 외국어로 관리하는 적절한 방법은 무엇입니까?

문제는 C 문자열이 원래 String, 그리고 내가 명시 적으로 해제되어야 할 것이다 스토리지를 할당 할 필요가 그것에서 C 문자열을 얻을 수 있다는 것입니다 (하스켈의 free 또는 finalizerFree, newCString에 대한 문서가 말한대로) .

어떻게 처리 할 수 ​​있습니까? 특히 나는 몇 가지 고려 사항이있어 :

이상하게도 어떻게 든 Haskell 런타임 GC가 처리하도록하고 싶습니다.하지만 언제 어떻게 알 수 있을지 확신 할 수 없습니다. 메모리가 여전히 필요합니다. 외국 측. 가능한가?

그렇지 않은 경우 C의 free을 호출하거나 Haskell 런타임이 유지 관리하는 CString 저장소입니까? 그렇지 않다면 Haskell의 free을 잘 수출하고 외국 측에서 전화해야겠습니까?

+1

'CString'은 알몸 포인터의 별명입니다. Haskell은 메모리를 관리하지 않습니다. 원하는 경우 [ForeignPtr] (https://hackage.haskell.org/package/base/docs/Foreign-ForeignPtr.html)을 만들 수 있지만 약간의주의가 필요합니다. 포인터를 사용할 때마다 포인터는 [''withForeignPtr'] (https://hackage.haskell.org/package/base/docs/Foreign-ForeignPhr.html#v:withForeignPtr) 호출 내에 완전히 포함되어야합니다. – Rufflewind

+0

문자열이 너무 크지 않고 변형되지 않은 경우 복사본을 해제하는 것이 좋습니다. 한 복사본이 외부에서 소유되고 다른 사본이 Haskell 런타임에서 소유되도록하는 것이 좋습니다. 그렇지 않으면 문자열의 소유권을 하스켈에게 건네주는 외국 측을 생각할 수 있습니다. 즉, 외국 측은 메모리에 대한 참조를 유지하지 않으며, 무엇인가를해야한다면 하스켈로 다시 호출합니다. –

답변

1

문자열을 할당 해제해야합니다. 하스켈의 GC가 외국 측에서는 여전히 필요한지 알 수있는 방법이 없습니다.

하스켈의 free은 정확히 C의 free과 같습니다. 원하는 쪽에서 어느 쪽이라도 전화 할 수 있습니다.

free :: Ptr a -> IO() 
free = _free 

foreign import ccall unsafe "stdlib.h free" _free :: Ptr a -> IO() 

이 하스켈 보고서 + FFI 부록에 의해 위임 된 경우 내가 확인하지 않은,하지만 난 그렇게 생각 것입니다.

+1

'pokeArray'와 외부 할당 버퍼를 안전한쪽에 사용할 수도 있습니다. – Rufflewind

+1

"Haskell의'free'는 C의'free'와 정확히 동일합니다. - 사실일지도 모르지만주의가 필요합니다. http://blog.haskell-exists.com/yuras/posts/malloc-free-and-ffi.html을 참조하십시오. –