Lua - 类析构函数的延迟调用。

我正在开发一款 C++ 程序,该程序实际上只是执行了一个 Lua 脚本。在 Lua 脚本中,我导出了从我的 C++ 程序中构造的类。

我的 main() C++ 函数在一些准备后调用了以下内容...

luabind::call_function<void>(m_L, "main");

现在我的 Lua 脚本如下所示:

local function test()
local c = C()
end

function main()
    for i=1,2 do
        log(i)
        test()
    end
end

我在 C 的析构函数中包含了 std::cout << "destructor" << std::endl;,以便我知道何时调用它。我期望 Lua 的垃圾回收器在每次 test() 执行结束时调用 c 的析构函数,因为那时它已经超出了其范围。但实际输出如下:

1
2
destructor
destructor

而不是

1
destructor
2
destructor

有没有人知道为什么会这样呢?我漏掉了什么吗?

原文链接 https://stackoverflow.com/questions/10107917

点赞
stackoverflow用户365496
stackoverflow用户365496

我期望当执行 test() 结束并且超出作用域时,lua的垃圾回收会调用c的析构函数,因为那时对象已经不被使用。

然而实际情况并非如此。Lua的垃圾回收不会在每个作用域的结束时运行。在垃圾回收语言中,不能确定对象析构的具体时间。在一些语言中甚至可能永远不会被销毁。

无法使Lua自动确定性地销毁对象,就像C++一样。

如果你依靠对象的确定性销毁,可以使用Lua的collectgarbage函数,但最好是根据实际情况重新设计你的代码。

这是 Lua文档中垃圾回收的具体实现。


下面是一个使用collectgarbage的例子:

local function test()
    local c = C()
end

function main()
    for i=1,2 do
        log(i)
        test()
        collectgarbage "collect"
    end
end
2012-04-11 14:34:30