OCaml中自定义块的垃圾收集

时间:2015-09-11 23:36:07

标签: garbage-collection ocaml

来自OCaml文档的部分19.6具有此功能来分配窗口块:

/* 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应该分配到其他地方 - 但是如何收集呢?

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

1 个答案:

答案 0 :(得分:0)

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

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

delwin删除了curses中的Windows。就我所见,示例代码并没有提供调用此函数的方法。

在一个实际的应用程序中,你可以想象在OCaml窗口包装器的终结代码中调用delwin,但是这种问题是有问题的。它不可能预测何时运行终结代码。你不希望在屏幕上闲停一段未知的时间。

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

通过定义像with_window这样的高阶函数,您可以更好地处理短期窗口。它会在最后删除窗口,因此僵尸窗口无法停留。