这个问题是关于函数 alloca
和 malloc
来自Foreign.Marshal.Alloc
和 newForeignPtr
和 mallocForeignPtr
来自Foreign.ForeignPtr
。分配的内存位于何处以及垃圾收集器如何处理它?</p>
最佳答案
由 malloc
分配的 Ptr a
所指向的内存位于堆上,就像在 C 编程语言中一样。它会被垃圾收集器忽略 - 您必须使用 free
自行手动释放它,并小心此后不再使用它。
alloca f
执行类似的分配,使用指针调用 f
,然后释放内存。 f
返回后不得使用该指针。
这些例程并不适合在日常代码中使用,而只是使用类似 C 的接口(interface) (FFI) 与其他语言进行交互。您可以获得与 C 提供的完全相同的内存安全保证——这意味着实际上没有。因此它是相当危险的,应该小心使用。
相比之下,ForeignPtr
指向的内存仍然存在于堆上,但在不再有指针(即Haskell的ForeignPtr a
)引用该内存后将被垃圾回收。请注意,即使这里使用了垃圾回收,这种指针也不是没有风险的。事实上,当 Haskell 不再有指向内存的事件指针时,运行时将释放它,即使该指针在外语中仍然事件。程序员必须确保这种情况永远不会发生。
关于haskell - GHC 在哪里分配外部内存以及垃圾收集器如何处理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38349273/