2016-12-14 2 views
1

Пожалуйста, следуйте моим входные комментарии (с использованием Lua 5.3.2 на JDoodle):Что делает сборщик мусора, когда он собирает мертвый объект?

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); 

Я думал таблицу в table удалит weakvalues[1] после назначения table с nil.

+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 вручную, не так ли? Зачем так называться и два раза? Он работал только с одним вызовом. – Hydro

+1

Ценности с финализаторами требуют двух полных циклов сбора до того, как их память будет восстановлена ​​(в первый цикл вызывается их метаметоды '__gc', во втором - освобождается память). Это не требуется большую часть времени (и иногда этого недостаточно для очистки «недоступного» объекта), но это как-то застряло ... – siffiejoe

Смежные вопросы