テーブルのネストされたテーブルのLuaガベージコレクション
-
05-07-2019 - |
質問
[Luaのマニュアルを読みましたが、確固たる答えが得られませんでした。]
インデックス付き配列として機能するLuaテーブルがあるとしましょう:
local myArray = {};
myArray[1] = "Foo";
myArray[2] = "Bar";
この表をどのように処分すればよいですか? myArrayをnilに設定するだけですか?または、配列を反復処理し、各インデックス付き要素をnilに設定する必要がありますか?
同様に、辞書として機能するLuaテーブルを持っているとしましょう:
local myDictionary = {};
myDictionary["key1"] = "Foo";
myDictionary["key2"] = "Bar";
「myDictionary」をnilに設定することはできますか、それとも繰り返し処理する必要がありますか?
最後に、テーブルをネストしているメモリ管理に関して、私は何をしますか?例:
local myNestedCollection = {};
myNestedCollection[1] = {1, 2, 3};
myNestedCollection[2] = {4, 5, 6};
これらの各サブテーブルを反復処理して、nilに設定する必要がありますか?助けてくれてありがとう。
解決
ほとんどのGCでは、オブジェクトへの参照がない場合にオブジェクトが収集されます。参照チェーンのトップをnilに設定すると、子への参照が削除されます。それが唯一の参照である場合、子が収集されます。
他のヒント
ローカル変数を nil
に設定するだけで十分です。すべてのキーを繰り返し処理して nil
に設定する必要はありません。 このページによると、Luaはマークアンドスイープガベージコレクションアルゴリズムを使用しています。ローカル変数を nil
に設定するとすぐに、そのテーブル内のキーは到達不能になるため、次のコレクションでガベージコレクターによって収集されます。同様に、それらのオブジェクトもテーブルである場合、それらのキーも到達不能になるため、それらも収集されます。
所属していません StackOverflow