假设我有一个外部函数:
-- | Turns char* of the given size into a char* of size 16.
doSomethingFfi :: Ptr CUChar -> Ptr CUChar -> CSize -> IO ()
doSomethingFfi = undefined
该函数是纯函数,因此我想将其表示为 Haskell 中的纯函数:
doSomething :: ByteArray bytes => bytes -> bytes
doSomething bs = unsafePerformIO $
alloc 16 $ \outPtr ->
withByteArray bs $ \inPtr ->
doSomethingFfi outPtr inPtr (fromIntegral $ length bs)
(这里我使用alloc
from memory
。)
unsafePerformIO
我的理解是和之间的唯一区别unsafeDupablePerformIO
是后者中的 IO 操作可以在不进行任何清理的情况下静默终止。
在我上面的例子中,基本上发生了两个 IO 操作: 1. 内存分配;2.外呼。我不关心2,因为它是纯粹的,但是我担心内存。
如果计算被静默中断,是否可以保证以这种方式分配的内存不会泄漏?如果外部功能还需要我必须分配/清理的临时存储并且我用于alloca
此目的,那么它仍然可以安全使用unsafeDupablePerformIO
吗?