OCaml垃圾收集幻像类型

时间:2014-02-24 12:26:30

标签: c garbage-collection ocaml

假设我有一个与OCaml接口的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中的终结器函数,但这是一个不需要的依赖项,并且只有在没有人复制记录时才会起作用。我想有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

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

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