c - OCaml 垃圾收集幻像类型

标签 c garbage-collection ocaml

假设,我有一个与 OCaml 接口(interface)的 C 库:

  type _npnum;;

  external _create_zero : int -> int -> _npnum = "ocaml_tnp_number_create_zero" ;;

  external _delete : _npnum -> unit = "ocaml_tnp_number_delete" ;;

C 库分配对象并通过 OCaml 的 Int32/64 表示返回它们(我从 ctypes“偷”了它)。

但我实际上希望 OCaml 对这些对象进行垃圾回收,那么我如何告诉编译器/运行时 _delete 应该用于清理 _npnum

我试图将整个事情包装到一条记录中,并使用了 Core 中的终结器函数,但这是一种不需要的依赖关系,而且只有在没有人复制记录的情况下才有效。我想有更好的解决方案吗?

最佳答案

在标准库中有Gc.finalise如果你的数据类型是抽象的,在大多数情况下没有人能够复制它(但是正如 Pascal 在下面正确指出的那样,有一些极端情况)。

如果您真的想处理这些极端情况,请使用 custom block在 C 大小上包装指针并将其公开为抽象类型。这将允许您附加自定义终结器、正确处理编码(marshal)处理并且 Weak.get_copy 不会尝试复制它。

关于c - OCaml 垃圾收集幻像类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21987740/

相关文章:

Java 8 lambda 闭包和 GC

c# - 在 C# 中测量内存压力/GC 执行

ocaml - 懒惰列表的 `partition` 实现良好吗?

c - 二分查找时上限失败

c - 使用数组时出现意外结果

Java堆增长

algorithm - 在 OCaml 中创造一个世纪

OCaml的let多态实现

c - 直接写入 C 中的内存位置适用于微 Controller ,但不适用于 PC

c++ - malloc 失败条件