2009-06-17 5 views
3

[私はLuaのマニュアルを読んで、それは固体の答えを提供していませんでした。]Luaのガベージコレクション、ネストされたテーブル

のは、私はインデックス付き配列として働く、Luaのテーブルがあるとしましょう:

local myArray = {}; 
myArray[1] = "Foo"; 
myArray[2] = "Bar"; 

この表を処分するにはどうすればよいですか? myArrayをnilに設定するだけですか?または、配列全体を反復処理し、各インデックス要素をnilに設定する必要がありますか?

同様に、のは私が辞書として機能し、Luaのテーブルを持っているとしましょう:

local myDictionary = {}; 
myDictionary["key1"] = "Foo"; 
myDictionary["key2"] = "Bar"; 

私はnilに「myDictionary」に設定することができ、または私は反復処理する必要がありますか?

最後に、ネストされたテーブルがある場所で、メモリ管理が賢明です。例えば

local myNestedCollection = {}; 
myNestedCollection[1] = {1, 2, 3}; 
myNestedCollection[2] = {4, 5, 6}; 

これらの各サブテーブルを反復処理する必要がありますか?助けてくれてありがとう。

答えて

5

ほとんどのGCでは、オブジェクトが参照されていないときにオブジェクトが収集されます。参照チェーンの先頭をnilに設定すると、子への参照が削除されます。それが唯一の参考資料だった場合、子供たちは集められます。

+0

SpliFFとAdamの両方に感謝します。 – SirRatty

6

ローカル変数をnilに設定するだけで十分です。すべてのキーを反復してnilに設定する必要はありません。 this pageによると、Luaはマークアンドスイープガベージコレクションアルゴリズムを使用しています。ローカル変数をnilに設定するとすぐに、テーブルのキーが到達不能になり、次のコレクションのガベージコレクタによって収集されます。同様に、それらのオブジェクトがテーブルでもある場合、そのオブジェクトのキーも到達不能になるので、それらも収集されます。

関連する問題