gpt4 book ai didi

haskell - peekCString 和 peekCStringLen 是懒惰的吗?

转载 作者:行者123 更新时间:2023-12-05 00:07:50 29 4
gpt4 key购买 nike

我有一个 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 还是懒惰创建?

最佳答案

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)

关于haskell - peekCString 和 peekCStringLen 是懒惰的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1739186/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com