Как мне справиться со сбором мусора Lua в моих объектах пользовательских данных? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как мне справиться со сбором мусора Lua в моих объектах пользовательских данных? [дубликат]

Сообщение Anonymous »

При создании Lua API для кода C я создал функцию Thing, которая создает пользовательские данные Lua, которые возвращают пользовательские данные для структуры C, также называемой Thing. У меня также есть функция List< /code>, который возвращает пользовательские данные Lua для структуры C под названием List, которая содержит указатели C для объектов Thing.
Если у меня есть скрипт Lua:< /p>

Код: Выделить всё

local list = List()
local thing = Thing()
list:add(thing)
thing:setField(123)

return function()
list:do_something()
end
а затем в моем коде на C я неоднократно вызываю lua_pc возвращаемую функцию, сборщик мусора Lua удалит Thing. Однако структура C моего списка содержит указатель на вещь, поэтому вещь не должна подвергаться сборке мусора.
Каким будет лучший способ сказать Lua не собирать мусор? Будет ли это (а) сделать list:add(thing) добавлением дубликата вещи, а не указателя на саму вещь? Однако это сделало бы код немного менее удобным, так как если быthing был изменен после list:add(thing), то list не был бы изменен.
Или лучше было бы (б) создать функцию-оболочку вокруг Thing() следующим образом:

Код: Выделить всё

function NewThing()
local ret = {
userdata: Thing(),
dependencies: {}
}
function ret:add(thing)
self.userdata:add(thing)
dependencies[#dependencies+1] = thing
end
end
Я считаю, что это может сработать, но я не знаю, действительно ли наличие ссылки Lua внутри часто используемой таблицы заставит сборщик мусора не собирать мусор для пользовательских данных, которые справочные ссылки. Я почти уверен, что это сделает это безопасным, но я просто хочу быть уверенным и хочу знать, какой подход будет лучше или существует ли лучший альтернативный подход.


Подробнее здесь: https://stackoverflow.com/questions/790 ... ta-objects
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»