lua_unref на объекте, используемом в Lua - PullRequest
1 голос
/ 21 января 2011

В руководстве Lua мы читаем:

Ссылка - это уникальный целочисленный ключ.Пока вы не добавляете целочисленные ключи вручную в таблицу t, luaL_ref обеспечивает уникальность возвращаемого ключа.Вы можете получить объект, на который ссылается ссылка r, вызвав lua_rawgeti (L, t, r).Функция luaL_unref освобождает ссылку и связанный с ней объект .

Предположим, я создаю ссылку на объект, помещаю ее в стек API и сохраняю вглобальная переменная, а затем вызвать luaL_unref .... она освобождается, несмотря на то, что на нее указывает Lua?

Пример кода:

lua_newtable( L );
int index = luaL_ref( L, LUA_REGISTRYINDEX );
lua_rawgeti( L, LUA_REGISTRYINDEX, index );
lua_setglobal( L, "test" );
luaL_unref( L, LUA_REGISTRYINDEX, index );   
lua_getglobal( L, "test" ); // ...?

Ответы [ 2 ]

4 голосов
/ 21 января 2011

Было бы.

Lua Registry - это просто таблица.Никакой магии здесь.

Итак, ваш код примерно эквивалентен следующему (за исключением того, как lua_ref работает с индексами):

local t = { }
local index = #_R + 1 -- Assume that fictional _R is registry
_R[index] = t
_G["test"] = t -- Non-fictional _G is a global environment
_R[index] = nil

Также обратите внимание, что ваш пример не делаетмного смысла.(Я предполагаю, что это слишком упрощено.) Вам не нужно помещать таблицу в реестр, прежде чем сохранять ее как глобальную переменную.

Чтобы ваша таблица без ссылок была уничтожена, вам нужно, чтобы GC включил ее.Он не может запустить между lua_newtable и lua_setglobal, если вы вызываете их один за другим, не возвращая контроль над Lua между ними.До тех пор, пока вы не вернете контроль Lua, на вашу таблицу "ссылаются" в стеке Lua.

0 голосов
/ 12 марта 2014

Нет, он явно не освобожден.

Я думаю, что между вопросом и предыдущим ответом может быть некоторая путаницаФункция luaL_unref просто не ссылается на объект, она фактически не выполняет бесплатную операцию.Таким образом, если переменная все еще ссылается на объект, она остается живой и не освобождается.

Проблема заключается в формулировке ссылки.Связанный объект «освобожден из реестра», но не «освобожден из системы памяти».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...