相关疑难解决方法(0)

71
推荐指数
7
解决办法
6万
查看次数

如何在Haskell中对手动分配的数据进行垃圾收集?

我正在考虑从Haskell调用一些C函数的FFI.

如果内存缓冲区用于保存某些数据并且是"手动"分配然后在Haskell计算中使用,那么我可以以某种方式依赖垃圾收集器在不再需要它时释放它.

至于手动分配,基本上有两种方式(但差异对于我的问题似乎并不重要):

  • 在Haskell中分配缓冲区,然后将其传递给C函数,就像在 fdRead
  • 在C中分配一个缓冲区(malloc就像在GNU中一样asprintf),然后返回指向Haskell的指针

在两个示例(fdReadasprintf)中,还存在一个问题,即存储在缓冲区中的数据类型不适合Haskell程序,因此将其复制并转换为在Haskell(with peekCString)中使用.(我将把代码放在下面.)复制和转换发生后,缓冲区被释放(在两种情况下).

但是,我正在考虑一个更有效的接口,Haskell将直接使用数据,因为它是由C函数存储的(没有转换).(我还没有探讨过替代实现String和相关函数:它们中是否有一个可以直接使用某种C字符串.)

如果我遵循这条路线,那么就存在一个全局问题:如何控制已分配缓冲区的处理.(对于没有副作用的函数 - 除了分配 - 我甚至可以将调用包装起来unsafePerformIO或声明它们,以便它们不是IO.)

转换和立即释放的示例

在Haskell中分配:

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)

garbage-collection haskell memory-management ffi

6
推荐指数
1
解决办法
185
查看次数