我正在研究一个基本上只执行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
有谁知道为什么会这样?我在这里错过了什么吗?
答案 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