3

[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 に設定する必要がありますか? 助けてくれてありがとう。

4

2 に答える 2

6

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

于 2009-06-17T04:55:03.203 に答える
5

ほとんどの GC では、オブジェクトへの参照がない場合にオブジェクトが収集されます。参照チェーンのトップを nil に設定すると、子への参照が削除されます。それが唯一の参照であった場合、子は収集されます。

于 2009-06-17T04:55:53.313 に答える