我正在为Lua写一个模块.在关闭lua解释器时,即使用户忘记隐式调用shutdown例程,它也必须运行清理例程. 该模块大多用C语言编写. 我应该使用Lua C Api中的哪些回调来检测程序执行的结束?我
该模块大多用C语言编写.
我应该使用Lua C Api中的哪些回调来检测程序执行的结束?我唯一的想法是在表示我的模块的表上使用__gc元方法.有任何想法吗?
在C模块中,最简单的方法是使用带有__gc元方法的元表创建一个完整的用户数据.将其存储在模块环境中的某个字段中,以便在卸载模块之前GC不会收集它.根据the manual,只有userdata获取收集器调用的__gc元方法,因此您不能使用表来保存模块的终结器.
对于用纯Lua编写的需要终结器的模块,你仍然需要有一个用户数据来支持它.不支持和未记录但广泛知晓的函数newproxy()
可用于创建具有用于此目的的元表的否则为空的用户数据.将其称为newproxy(true)以获取具有metatable的一个,并使用getmetatable()来检索metatable,以便您可以向其添加__gc元方法.