2015-01-29 3 views
1

Смотрите следующий пример:Что такое подсчет ссылок в Lua?

local t = {} 

t[1] = function() return 3 end 
t[2] = function() return 2 end 
t[3] = 3 

local a = t[1] 

local b = t 
t[1] = nil 
collectgarbage("collect") --reclaim memory 
print(a) --function 
print(b[1]) -- nil 
print(b[2]) --function 
print(b[3]) --3 

Почему я до сих пор напечатать 'A' вместо 'б [1]? Кроме того, я вижу «Слабая ссылка игнорируется сборщиком мусора» в справочном руководстве по lua. Как определить «игнорировать»?

ответ

3

Назначение (=) присваивает значение что-то в Lua, оно никогда не создает псевдоним.

Таким образом, это просто не имеет отношения к a, назначенная nil к b[1], после того, как вы назначили b[1] в a.


Что касается вашего вопроса: GC

У вас есть только сильные ссылки в вашем фрагменте кода, без каких-либо слабых.
И игнорируется означает, что при определении объектов жизни не следует следовать. Конечно, это nil -ed, если цель объявлена ​​недостижимой.
У Lua есть трассировочный GC, а не ссылочный счет, который будет иметь проблемы с круговыми ссылками.

+0

Где я могу найти материалы о lua GC? – NiklausTseng

+0

Посмотрите официальную документацию на веб-сайте Lua. Это вполне читаемо. http://www.lua.org/manual/ – Deduplicator

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