Lua shutdown /程序执行回调结束

时间:2010-10-12 06:59:45

标签: c lua luabind

我正在为Lua写一个模块。在关闭lua解释器时,它必须运行清理例程,即使用户忘记隐式调用shutdown例程。

该模块主要用C语言编写。

我应该使用Lua C Api中的哪些回调来检测程序执行结束?我唯一的想法是在表示我的模块的表上使用__gc元方法。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

在C模块中,最简单的方法是使用带有userdata元方法的metatable创建一个完整的__gc。将其存储在模块环境中的一个字段中,以便在卸载模块之前GC不会收集它。

根据the manual,只有userdata获取收集器调用的__gc元方法,因此您无法使用表来保存模块的终结器。

对于用纯Lua编写的需要终结器的模块,您仍然需要userdata来保持它。不受支持且未记录但广为人知的函数newproxy()可用于创建一个空的userdata,其中包含用于此目的的元表。将其命名为newproxy(true)以获取具有元表的元素,并使用getmetatable()检索元数据,以便您可以向其添加__gc元方法。