OCaml 中自定义块的垃圾收集

Garbage-collection of custom blocks in OCaml

OCaml 文档的 19.6 部分具有分配 window 块的函数:

/* Allocating an OCaml custom block to hold the given WINDOW * */
static value alloc_window(WINDOW * w)
{
  value v = alloc_custom(&curses_window_ops, sizeof(WINDOW *), 0, 1);
  Window_val(v) = w;
  return v;
}

这是示例中唯一的分配函数。据推测,WINDOW 应该分配到其他地方——但是如何收集它呢?

编辑:哦,curses_window_ops结构中的finalize函数...请忽略我。

在此示例代码中,curses windows 由外部函数分配:

external newwin: int -> int -> int -> int -> window = "curses_newwin"

Windows 中的 curses 被 delwin 删除。据我所知,示例代码没有提供调用此函数的方法。

在实际的应用程序中,您可以想象在 OCaml window 包装器的最终代码中调用 delwin,但这种事情是有问题的。真的不可能预测最终代码何时 运行。您不希望 window 在屏幕上停留一段未知的时间。

您更有可能希望提供 OCaml 调用来显式删除 window。这将使 OCaml window 包装器处于僵尸状态。即,由程序员记住该对象不再代表屏幕上的 window。最终它将被 GC 收集(当不再可访问时)。

您可以通过定义像 with_window 这样的高阶函数来更好地处理短期 windows。它会负责删除最后的window,所以僵尸window没有办法徘徊。