2012-04-11 27 views
4

私は基本的にはluaスクリプトを実行するC++プログラムに取り組んでいます。そのluaスクリプトでは、しかし、私のC++プログラムからluaスクリプトにエクスポートされたクラスが構築されます。私の主な()C++関数は、単にいくつかの準備の後に呼び出すlua - クラスデストラクタの遅い呼び出し

...

luabind::call_function<void>(m_L, "main"); 

は今私のluaスクリプトは、私は、STDが含まれている

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

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

この:: < <裁判所未満 "のように見えますデストラクタ "< < std :: endl; Cのデストラクタでそれが呼び出されるときを知っています。私はluaのガーベジコレクションが、test()が終了するたびにcのデストラクタを呼び出すことを期待しています。なぜなら、それはスコープから外れるからです。代わりに、私は次の出力を参照してください。

1 
2 
destructor 
destructor 

ではなく

1 
destructor 
2 
destructor 

を誰もがこれである理由のアイデアを持っていますか?私はここに何かを逃していますか

答えて

8

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

これは該当しません。 Luaのガベージコレクションは、すべてのスコープの最後に実行されません。これは、デストラクタが実行されたときに依存できないガベージコレクション言語の典型であり、一部の言語ではオブジェクトがまったく破棄されることはありません。

C++のように、Luaが自動的にオブジェクトを確定的に破壊するような方法はありません。

これに依存しなければならない場合は、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 
+0

うーん、それはかなり不快です。今、わかりやすくするためにこの例を減らしましたが、私の実際のアプリケーションでは、cは巨大なオブジェクト(約100-1000 MB)です。それはきれいにする必要があります!私の予想される行動をルアから得る方法はありますか? –

+1

@ chris.schuette:Cで 'lua_gc'、またはLuaで' collectgarbage'が本当に必要な場合は、手動でガベージコレクタを呼び出すことができます – sbk

+0

すごくありがとう! –

関連する問題