我有一个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,还是懒得创建?
答案 0 :(得分: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)