【发布时间】:2016-12-14 00:18:30
【问题描述】:
这是我的测试代码:
mt={}
myt={}
setmetatable(myt, mt)
mt.__gc=function()print("hello gc")end
myt=nil
collectgarbage()
但是,当我运行此代码时,没有消息打印。
所以,我认为我的代码一定有问题。
更新:
mt.__gc=function()print("hello gc")end
setmetatable(myt, mt)
在setmetatable 之前设置__gc 字段可以解决问题(使用在线interpreter),但是,当我在我的程序中通过C API luaL_dofile 执行相同的代码时, __gc 又死了。
我还在我的独立 lua 解释器(lua 5.1.5)中进行了测试,'__gcc' 也死了。
唯一正常工作的情况是在线interpreter 版本是5.3。
所以,我应该问我如何才能让 '__gc' 在我的 5.1 版本下工作?
【问题讨论】:
-
__gc调用setmetatable时,元方法应该在元表中。当然它只适用于 Lua 5.2 -
setmetatable({}, {__gc = function() print("hello gc") end}) collectgarbage()在 Lua 5.2 上测试 -
非常感谢@moteus。但是为什么?因为,当我在调用 'setmetatable' 之后设置元表的其他元素时,它们都可以正常工作,例如 __index、一些函数、变量......为什么“GC”如此特别?有官方文档说明吗?
-
是的,我找到了这个注释。但是,我仍然无法在我的 'luaL_dofile' c api 案例中正确运行此代码。在我的案例中我还需要知道其他任何注释吗?@ moteus