phi*_*chu 8 garbage-collection haskell memory-management ghc
这个问题是关于功能alloca
和malloc
从Foreign.Marshal.Alloc
和newForeignPtr
和mallocForeignPtr
从Foreign.ForeignPtr
.分配的内存在哪里,垃圾收集器如何处理它?
Ptr a
由malloc
生命分配在堆上指向的内存,如在C编程语言中.它被垃圾收集器忽略 - 你必须自己手动解除分配free
,并注意在此之后再也不要使用它.
alloca f
执行类似的分配,f
使用指针调用,然后释放内存.f
返回后不得使用指针.
这些例程不是用于日常代码,而是仅用于与其他语言的接口,使用类似C的接口(FFI).您可以获得C提供的完全相同的内存安全保障 - 这几乎意味着没有.因此它非常危险,应该非常谨慎地使用.
相比之下,ForeignPtr
-pointed内存仍然存在于堆上,但在没有更多指针(即Haskell ForeignPtr a
)引用内存之后将被垃圾收集.请注意,即使在这里使用垃圾收集,这种指针也没有风险.实际上,当Haskell没有更多关于内存的实时指针时,运行时将释放它,即使该指针仍然存在于外语中.程序员必须确保永远不会发生这种情况.
malloc
调用 C malloc()
,因此它在 C 堆上分配内存,您必须手动释放该内存。free()
(如果您愿意,也可以从 C 中执行此操作。)
alloca
并mallocForeignPtr
分配固定字节数组,这些数组位于 Haskell 固定堆上。当不再需要它们时,GC 会自动释放它们,但永远不会移动它们(因为它们被固定),因此您可以将它们的地址传递给 C 函数。
newForeignPtr
似乎与你的问题无关。