4

nullで終了する文字列を作成し、その文字列へのポインタを返すC関数があります。また、対応する割り当て解除関数もあります。

foreign import ccall unsafe "get_str" getStr :: IO CString
foreign import ccall unsafe "free_str" freeStr :: CString -> IO ()

返されたCStringからHaskell文字列を作成し、できるだけ早くCStringを解放したいと思います。

do cStr <- getStr
   str <- peekCString cStr
   freeStr cStr
   -- here str is used

strを使用する前にcStrを解放しても安全ですか?言い換えれば、peekCStringはHaskell Stringを一度に作成しますか、それとも怠惰に作成されますか?

4

1 に答える 1

7

peekCStringは厳密です。たとえば、unsafeInterleaveIOを介してループを中断することはありません。したがって、文字列の先頭を取得したら、確実に末尾を計算します。実装は次のとおりです。

peekCAString cp = do
  l <- lengthArray0 nUL cp
  if l <= 0 then return "" else loop "" (l-1)
  where
    loop s i = do
        xval <- peekElemOff cp i
        let val = castCCharToChar xval
        val `seq` if i <= 0 then return (val:s) else loop (val:s) (i-1)
于 2009-11-15T23:46:14.130 に答える