chr*_*tte 4 c++ lua garbage-collection destructor
我正在研究一个基本上只执行lua脚本的c ++程序.在那个lua脚本中,然而构造了类,这些类已经从我的c ++程序导出到lua脚本.
我的main()c ++函数只是在做了一些准备之后调用了...
luabind::call_function<void>(m_L, "main");
Run Code Online (Sandbox Code Playgroud)
现在我的lua脚本看起来像这样
local function test()
local c = C()
end
function main()
for i=1,2 do
log(i)
test()
end
end
Run Code Online (Sandbox Code Playgroud)
我已经包含了一个std :: cout <<"析构函数"<< std :: endl; 在C的析构函数中所以我知道它什么时候被调用.我希望lua的垃圾收集在每次执行test()时都会调用c的析构函数,因为那时它就超出了范围.相反,我看到以下输出:
1
2
destructor
destructor
Run Code Online (Sandbox Code Playgroud)
而不是
1
destructor
2
destructor
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会这样?我在这里错过了什么吗?
我希望lua的垃圾收集在每次执行test()时都会调用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
Run Code Online (Sandbox Code Playgroud)