Потерянные ссылки в Lua - PullRequest
       26

Потерянные ссылки в Lua

3 голосов
/ 17 декабря 2009

Возникла проблема с объектами, больше не нужна, но все еще есть ссылки. Результат: объем выделенной памяти постоянно увеличивается из-за не собранных объектов.

Как решить такую ​​проблему? Есть ли способ найти объекты только с одной ссылкой или объекты с временем жизни больше некоторого значения? Или любое другое решение?

Использование Lua 5.1 и C ++ с luabind.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 18 декабря 2009

Как кто-то упоминает здесь, вы можете попробовать использовать слабые таблицы .

Если у вас есть такой код:

myListOfObjects = {}
...
table.insert(myListOfObject, anObject)

Затем, как только anObject перестанет использоваться, оно никогда не будет освобождено, поскольку myListOfObjects все еще ссылается на него.

Вы можете попробовать удалить ссылку в myListOfObjects (установив ссылку на ноль), но более простое решение объявляет myListOfObjects слабой таблицей :

myListOfObjects = {}
setmetatable(myListOfObjects, { __mode = 'v' }) --myListOfObjects is now weak

Учитывая, что setmetatable возвращает ссылку на изменяемую таблицу, вы можете использовать эту более короткую идиому, которая делает то же, что и две предыдущие строки:

myListOfObjects = setmetatable({}, {__mode = 'v' }) --creation of a weak table
1 голос
/ 17 декабря 2009

Я не уверен насчет интеграции его с C ++, но похоже, что сборщику мусора не дают возможности работать.

В вашем lua вы можете попробовать явно вызвать его и посмотреть, поможет ли это. В ядре есть функция apis collectgarbage(opt [, arg]).

...