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のデストラクタで、いつ呼び出されるかがわかります。lua のガベージ コレクションは、test() の実行が終了するたびに c のデストラクタを呼び出すと予想されます。これは、スコープ外になるためです。代わりに、次の出力が表示されます。

1
2
destructor
destructor

それよりも

1
destructor
2
destructor

これがなぜなのか誰にも分かりますか?ここで何か不足していますか?

4

1 に答える 1

8

lua のガベージ コレクションは、test() の実行が終了するたびに c のデストラクタを呼び出すと予想されます。これは、スコープ外になるためです。

これはそうではありません。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 に答える