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没有办法徘徊。
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没有办法徘徊。