haskell - GHC 在哪里分配外部内存以及垃圾收集器如何处理它?

标签 haskell memory-management garbage-collection ghc

这个问题是关于函数 allocamalloc来自Foreign.Marshal.AllocnewForeignPtrmallocForeignPtr来自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/

相关文章:

通过列表 monad 理解来理解 haskell 列表

c - 使用 calloc() 而不是 malloc() 和 memset() 有什么优势吗?

java - 无法使用 LeakCanary 监视 fragment (ClassCastException 错误)

c# - 列表.清除(); vs 列表<T> = 新列表<T>();垃圾收集性能

java - 将流类或连接视为 Java 中的资源泄漏

algorithm - 将 GenTree 转换为二叉树的函数

list - haskell列表和功能

haskell - 使用 Pandoc 创建文档

C++ delete 不释放所有内存 (Windows)

.net - .net 垃圾收集器何时运行?