2016-12-14 1 views
1

は(JDoodleでLuaの5.3.2を使用して)私の入力のコメントに従ってください:ガベージコレクタは、デッドオブジェクトを収集するときに何をしますか?

local table = {}; 

local weakvalues = setmetatable(
{ 
    table 
}, 
{ 
    -- Let weakvalues values 
    -- be weak, so that they fade when dead objects are g-c. 
    __mode = 'v' 
}); 

table = _; 

-- Now the previously ref. table is unreachable 
-- since there are no other references, I think so... 

-- Sychronously wait this loop statements 
-- in order to execute a next statement (maybe the 
-- garbage-collector would have collected the unreachable table above 
-- while this loop executes). 
for i = 1, 5e7 do end 

-- Expected to log 0, but it logs 1. Is the unreachable table 
-- still reachable? 
print(#weakvalues); 

私はniltableを割り当てた後weakvalues[1]を削除しますtableでテーブルを考えました。

+0

'v'は値です。しかしあなたの場合には 'k'が必要だと思います。 – moteus

+0

@moteus' 'k''は弱い鍵です... – Hydro

+1

申し訳ありません。あなたは正しいです – moteus

答えて

2

あなたのコードではゴミを収集することはありません。 このコードを試す

local t = {} 
local weakvalues = setmetatable({t},{ __mode = 'v'}) 
t = nil 
collectgarbage() collectgarbage() 
print(#weakvalues); 
+0

これは私が手動でc-gしなければならないことを意味します、そうですか?なぜそれを2回も呼びますか? 1回の呼び出しで機能しました。 – Hydro

+1

ファイナライザを持つ値は、メモリが再利用される前に2回のフルコレクションサイクルを必要とします(最初のサイクルで '__gc'メタメソッドが呼び出され、2回目の実行でメモリが解放されます)。たいていの場合は必要ありません(また、「到達不能」オブジェクトをクリーンアップするのに十分ではない場合もあります)。 – siffiejoe

関連する問題