Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Разработчикам [PtokaX] _ Переобъявление переменной

Автор: dimajak 5.12.2011, 21:46

Работает ли сабж?
Например, есть таблица с данными, для ее очистки использую следующий код:

Код
    tPlayers = nil
    tPlayers = {}
обязательно ли уничтожать таблицу?
Код
    tPlayers = nil
достаточно ли ее только объявить?
Код
    tPlayers = {}

Автор: Alexey 5.12.2011, 22:03

Достаточно.

PS: Для подобных вопросов есть http://mydc.ru/topic173.html.

Автор: Setuper 6.12.2011, 9:39

То что мы присваиваем переменной tPlayers значение nil не означает, что мы стираем из памяти таблицу, на которую указывала эта пременная до этого. Этим действием мы только удаляем ссылку на эту таблицу, а если на таблицу никто не ссылается, то таблица в скором времени будет удалена из памяти сборщиком мусора.
Если же мы пишем tPlayers = {}, то это означает, что мы создаём новую (пустую) таблицу и присваиваем переменной tPlayers ссылку на новую таблицу, при этом опять же, если на старую таблицу никто не ссылается, то таблица в скором времени будет удалена из памяти сборщиком мусора.

Автор: dimajak 8.12.2011, 2:15

Setuper, при удалении ссылки на эту таблицу кто может ссылаться на эту таблицу?

Автор: Setuper 8.12.2011, 9:45

Код
local a = {}
local b = a
a = nil


Создаётся таблица, и записывается в переменную "a" ссылка на эту таблицу.
В переменную "b" копируется ссылка на эту же самую таблицу (НЕ КОПИРУЕТСЯ сама таблица!).
Далее уничтожается ссылка переменной "a" на эту таблицу.
Однако на таблицу остаётся ссылка переменной "b", поэтому таблица не будет уничтожена сборщиком мусора.

Пример, показывающий, что мы действительно имеем дело с одной таблице и двумя ссылками на эту таблицу (то есть под таблицу память выделена 1 раз):
Код
local a = {v = 5}
local b = a
print(a.v) -- напечатает "5"
print(b.v) -- напечатает "5"
b.v = 6
print(a.v) -- напечатает "6"
print(b.v) -- напечатает "6"
a.v = 7
print(a.v) -- напечатает "7"
print(b.v) -- напечатает "7"


То есть, в данном примере переменные "a" и "b" равнозначны, так как ссылаются на одну и ту же таблицу (на одну и ту же память), и для изменения данных по этой памяти мы можем использовать как переменную "a", так и переменную "b".
Другими словами: действие b = a не приводит к копированию таблицы, оно лишь создаёт новую ссылку на уже существующую таблицу.