2009-06-17 5 views
3

[Я прочитал инструкцию Lua, но это не дает убедительные ответы.]Lua мусора таблиц, вложенные таблицы

Скажем, у меня есть Lua таблица, действующая как индексированный массив:

local myArray = {}; 
myArray[1] = "Foo"; 
myArray[2] = "Bar"; 

Как наилучшим образом избавиться от этой таблицы? Я просто устанавливаю myArray в nil? Или мне нужно перебирать массив и устанавливать каждый индексированный элемент на нуль?

Точно так же, скажем, у меня есть у меня есть Lua таблица, действуя в качестве словаря:

local myDictionary = {}; 
myDictionary["key1"] = "Foo"; 
myDictionary["key2"] = "Bar"; 

Могу ли я просто установить «MyDictionary» на ноль, или я должен перебрать?

И наконец, что мне делать, управление памятью мудро, где у меня есть вложенные таблицы? например

local myNestedCollection = {}; 
myNestedCollection[1] = {1, 2, 3}; 
myNestedCollection[2] = {4, 5, 6}; 

Нужно ли перебирать каждую из этих подтабликов, устанавливая их в нуль? Спасибо за любую помощь.

ответ

5

В большинстве GC объект будет собран, если на нем нет ссылок. Установка верха вашей ссылочной цепочки на ноль удаляет ссылку на детей. Если бы это была единственная ссылка, тогда дети будут собраны.

+0

Благодаря SpliFF и Adam за помощь в этом. – SirRatty

6

Достаточно установить только локальную переменную nil; нет необходимости перебирать все ключи и устанавливать их на nil. Согласно this page, Lua использует алгоритм сбора мусора и разметки мусора. Как только вы установите свою локальную переменную в nil, ключи в ее таблице становятся недоступными, поэтому они собираются сборщиком мусора в следующей коллекции. Аналогичным образом, если эти объекты также являются таблицами, их ключи также становятся недоступными, поэтому они также будут собраны.

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