假设,我有一个与 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/