我正在考虑从Haskell调用一些C函数的FFI.
如果内存缓冲区用于保存某些数据并且是"手动"分配然后在Haskell计算中使用,那么我可以以某种方式依赖垃圾收集器在不再需要它时释放它.
至于手动分配,基本上有两种方式(但差异对于我的问题似乎并不重要):
在两个示例(fdRead或asprintf)中,还存在一个问题,即存储在缓冲区中的数据类型不适合Haskell程序,因此将其复制并转换为在Haskell(with peekCString)中使用.(我将把代码放在下面.)复制和转换发生后,缓冲区被释放(在两种情况下).
但是,我正在考虑一个更有效的接口,Haskell将直接使用数据,因为它是由C函数存储的(没有转换).(我还没有探讨过替代实现String和相关函数:它们中是否有一个可以直接使用某种C字符串.)
如果我遵循这条路线,那么就存在一个全局问题:如何控制已分配缓冲区的处理.(对于没有副作用的函数 - 除了分配 - 我甚至可以将调用包装起来unsafePerformIO或声明它们,以便它们不是IO.)
fdRead(这里allocaBytes必须关心释放):
-- -----------------------------------------------------------------------------
-- fd{Read,Write}
-- | Read data from an 'Fd' and convert it to a 'String' using the locale encoding.
-- Throws an exception if this is an invalid descriptor, or EOF has been
-- reached.
fdRead :: Fd
-> ByteCount -- ^How many …Run Code Online (Sandbox Code Playgroud)