chi*_*chi 6

Ptr amalloc生命分配在堆上指向的内存,如在C编程语言中.它被垃圾收集器忽略 - 你必须自己手动解除分配free,并注意在此之后再也不要使用它.

alloca f执行类似的分配,f使用指针调用,然后释放内存.f返回后不得使用指针.

这些例程不是用于日常代码,而是仅用于与其他语言的接口,使用类似C的接口(FFI).您可以获得C提供的完全相同的内存安全保障 - 这几乎意味着没有.因此它非常危险,应该非常谨慎地使用.

相比之下,ForeignPtr-pointed内存仍然存在于堆上,但在没有更多指针(即Haskell ForeignPtr a)引用内存之后将被垃圾收集.请注意,即使在这里使用垃圾收集,这种指针也没有风险.实际上,当Haskell没有更多关于内存的实时指针时,运行时将释放它,即使该指针仍然存在于外语中.程序员必须确保永远不会发生这种情况.


Rei*_*ton 4

malloc调用 C malloc(),因此它在 C 堆上分配内存,您必须手动释放该内存。free()(如果您愿意,也可以从 C 中执行此操作。)

allocamallocForeignPtr分配固定字节数组,这些数组位于 Haskell 固定堆上。当不再需要它们时,GC 会自动释放它们,但永远不会移动它们(因为它们被固定),因此您可以将它们的地址传递给 C 函数。

newForeignPtr似乎与你的问题无关。