Lua сборка мусора таблиц, вложенные таблицы - PullRequest
3 голосов
/ 17 июня 2009

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

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

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

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

Аналогично, допустим, у меня есть таблица Lua, действующая как словарь:

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

Могу ли я просто установить для myDictionary значение nil или мне нужно выполнить итерацию?

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

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

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

Ответы [ 2 ]

6 голосов
/ 17 июня 2009

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

5 голосов
/ 17 июня 2009

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

...