【问题标题】:How to explicitly call lua gc?如何显式调用lua gc?
【发布时间】: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

标签: lua garbage-collection


【解决方案1】:

您需要在调用setmetatable之前设置__gc字段。

manual 说:

请注意,如果您设置一个没有__gc 字段的元表,然后在元表中创建该字段,则该对象将不会被标记为完成。

表的 GC 方法是在 Lua 5.2 中引入的。它们在 Lua 5.1 中不起作用。

【讨论】:

  • 是的,我现在注意到了这一点。但是正如我在上面最后一条评论中所说的,当通过 C API luaL_dofile 运行 lua 脚本时,不会使用上面相同的代码调用 GC。@lhf
  • @francis,你检查luaL_dofile的返回码了吗?如果是这样,请发布您的 C 代码。
  • 是的,我有。'luaL_dofile' 只是返回 0。没有发生错误。啊,我看到你编辑了你的答案。然后我将 5.1 文档与 5.2 进行了比较。你是对的,GC 元方法只能用于5.1中的userdata。@非常感谢。@lhf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2021-02-28
  • 1970-01-01
相关资源
最近更新 更多