*Luaリファレンス 要注意点 ~ガベージコレクト~ [#w7561c62]

**弱いテーブル(ガベージコレクトされやすいテーブル [#b7aaac4a]
通常、これらの機能が使われることはありません。
**弱いテーブル(ガベージコレクトされやすいテーブル [#q44a149c]

しかし、非常に大きなデータオブジェクトをテーブルに格納し、
これを途中で消したい場合などは、利用する機械があるかもしれません。
-通常、これらの機能が使われることはありません。~
しかし、非常に大きなデータオブジェクトをテーブルに格納し、~
これを途中で消したい場合などは、利用する機械があるかもしれません。~

変数をnilにするのが基本ですが、それだけでは駄目(というかやり難い)なこともあります。
-変数をnilにするのが基本ですが、それだけでは駄目(というかやり難い)なこともあります。
特に以下のように、テーブルのキーとして利用されている場合です。

#sh(lua){{
a = {}
key = {}

a[key] = 3

key = {} -- keyがここで新たに代入されたので、 a[key]の値は事実上不要になっているが…
key = {} -- keyがここで新たに代入されたので、 a[key]の値は不要になっているかもしれないが、Lua自身では感知できない。

a[key] = 4
collectgarbage()    -- ガベージコレクションを実行

for k, v in pairs(a) do
    print(k, v)
end
}}
デフォルトでは、途中でkeyが上書きされているからといっても、aのキーとして利用されているので、~
勝手に1つ目のa[key]がガベージコレクトの対象となったりはしません。~
しかし、これをガベージコレクトの対象としたいような場合、~
対象のテーブルの''メタテーブルに __mode = "k" ならキーが、 __mode = "v"なら値が 、__mode = "kv"なら両方が、ガベージコレクトの対象となる。''
~

-しかし、これをガベージコレクトの対象としたいような場合、~
__modeというキー持ったメタテーブルを、テーブルにセットします。~
~
対象のテーブルの''メタテーブルに __mode = "k" ならキーが、 __mode = "v"なら値が 、__mode = "kv"なら両方が、ガベージコレクトの対象となります。''
~
#sh(lua){{
a = {}
b = {__mode = "k"}
b = {__mode = "k"} -- このメタテーブルをセットされた場合、そのテーブルのキーが、他から参照されていないオブジェクトの場合のみ、ガベージコレクトの対象とする。という意味。
setmetatable(a, b)
key = {}

a[key] = 3

key = {}
a[key] = 4

collectgarbage()    -- ガベージコレクションを実行
 
for k, v in pairs(a) do
   print(k, v)
end
}}
~

-なお、キーが数値や文字列の場合は、決してガベージコレクトの対象にならないので注意。あくまでオブジェクト(テーブル、ユーザー定義)のみ。


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS