想象一下,我有一个名为 libcat 的 C 库,用于与我的毛茸茸的猫进行交互。因此,我正在为 OCaml 编写绑定来简化与 fluffy 的交互。
module type CAT = sig
type cat
val find : ... -> cat
val feed : cat -> unit
...
end ;;
module Cat : CAT = ...
libcat 中已经内置了相当多的内存管理功能,比如缓存、释放被破坏的玩具,甚至可能还有一个用于清空垃圾的有限范围的垃圾收集器。然而,总体而言,libcat 要求用户明确释放未使用的资源,例如丢失的玩具。
我为 Cat.find 编写了一个 C 存根,它使用 libcat 的 cat_find 例程查找并分配 cat,但随后将结果指向 cat 的指针存储在使用 caml_alloc_custom 创建的自定义块中。
我已将 Finalize 方法添加到传递到 caml_alloc_custom 的 custom_operations 结构中。至关重要的是,我用这个终结方法释放了猫,因为我厌倦了在我接听电话异常时她在门上抓挠。
我现在担心,如果 OCaml 复制了 Cat.cat 类型的自定义块,那么 OCaml 的垃圾收集器可能会在我们还在玩的时候释放 fluffy。例如 :
let fluffy = Cat.find ;;
fluffy.yodel ;;
let meow = fluffy ;;
...
meow.feed ;;
我们必须假设...将在最后一次显式引用 fluffy 之后触发 OCaML 的垃圾收集器,例如打破盘子。这个垃圾收集事件会调用 fluffy 的 Finalize 方法并释放她吗?或者meow会简单地引用fluffy原来的自定义块,从而阻止fluffy被释放?
我想在这种情况下 fluffy 不会被释放,否则 OCaml 肯定会在 custom_operations 结构中要求重复的方法,但我觉得最好问一下。如果 fluffy 实际上可能被释放,我可以通过仅让 OCaml 通过引用来处理她来防止这种情况吗?大致 :
type cat_name = real_cat ref
type real_cat