假设我有一个与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中的终结器函数,但这是一个不需要的依赖项,并且只有在没有人复制记录时才会起作用。我想有更好的解决方案吗?
答案 0 :(得分:1)
在标准库中有Gc.finalise,如果你的数据类型是抽象的,在大多数情况下没有人应该能够复制它(但是正如Pascal正确指出的那样,有一些极端情况)。
如果你真的想要处理这些极端情况,请在C大小上使用custom block来包装指针并将其作为抽象类型公开。这将允许您附加自定义终结器,正确处理封送处理,Weak.get_copy
将不会尝试复制它。