4

我正在开发一个基本上只是执行 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 << "destructor" << std::endl; 在 C 的析构函数中,所以我知道它何时被调用。我希望每次执行 test() 结束时,lua 的垃圾收集都会调用 c 的析构函数,因为那是它超出范围的时候。相反,我看到以下输出:

1
2
destructor
destructor

而不是

1
destructor
2
destructor

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

4

1 回答 1

8

我希望每次执行 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-11T14:34:30.373 回答