管理外语分配内存的正确方法是什么?

Mas*_*tic 9 haskell memory-management ffi ghc

我的情况非常简单:我有一个C++应用程序和一个Haskell库,我只需要从Haskell导出一个返回C字符串的函数.

问题是C字符串最初是一个String,并且要从中获取C字符串,我需要分配存储,这必须被显式解除分配(Haskell free或者finalizerFree,作为文档newCString说明).

处理这个问题的好方法是什么?具体来说,我有一些注意事项:

理想情况下,我想以某种方式让Haskell运行时GC处理这个问题,但我不确定它是什么时候可以知道外来方还需要内存的时间和时间.可能吗?

如果没有,我可以只调用C free或者是CStringHaskell运行时维护的存储吗?如果不是,我想我将不得不出口Haskell free并从外方调用它,对吗?

chi*_*chi 1

你确实必须释放字符串:正如你所说,Haskell 的 GC 无法知道外部是否仍然需要它。

Haskellfree与 C 完全等价free。您可以从您喜欢的一侧拨打电话。

free :: Ptr a -> IO ()
free  = _free

foreign import ccall unsafe "stdlib.h free"    _free    :: Ptr a -> IO ()
Run Code Online (Sandbox Code Playgroud)

我没有检查 Haskell 报告 + FFI 附录是否强制要求这样做,但我猜是这样的。