lua - 类析构函数的延迟调用

时间:2012-04-11 14:24:33

标签: c++ garbage-collection lua destructor

我正在研究一个基本上只执行lua脚本的c ++程序。在那个lua脚本中,然而构造了类,这些类已经从我的c ++程序导出到lua脚本。

我的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

我添加了一个std :: cout&lt;&lt; “析构者”&lt;&lt;的std :: ENDL;在C的析构函数中所以我知道它什么时候被调用。我希望lua的垃圾收集在每次执行test()时都会调用c的析构函数,因为那时它就超出了范围。相反,我看到以下输出:

1
2
destructor
destructor

而不是

1
destructor
2
destructor

有谁知道为什么会这样?我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:8)

  

我希望lua的垃圾收集在每次执行test()时都会调用c的析构函数,因为那时它会超出范围。

事实并非如此。 Lua的垃圾收集不会在每个范围的末尾运行。垃圾收集语言的典型特征是在运行析构函数时无法依赖它们,在某些语言中,对象可能永远不会被销毁。

没有任何方法可以让Lua像C ++那样确定地自动销毁对象。

如果您必须依赖于此,那么您可以使用Lua的collectgarbage功能,但是更改您的期望并相应地重新设计可能会更好。

Here's关于垃圾收集如何运作的Lua文档。


使用collectgarbage的一个例子:

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

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