Привязка Lua к C ++ и сборка мусора - PullRequest
6 голосов
/ 12 июля 2009

Хорошо, вот проблема, с которой я столкнулся.

У меня есть привязки Lua к механизму рендеринга, который имеет внутренний менеджер рендеринга, который хранит собственные треки указателей для сцены рендера и управляет ими.Проблема в том, что когда я использую его из Lua, если я не сохраняю ссылку Lua на каждый отдельный объект, который я добавляю в менеджер визуализации C ++, он начинает собирать указатели и, конечно, вызывать сбои.Я не особо хочу сохранять каждую ссылку на каждую вещь, которую я создаю.Есть ли способ заставить Луа не собирать мусор?Есть ли другие способы обойти эту проблему?

Я создаю привязки Lua с помощью SWIG.

1 Ответ

9 голосов
/ 12 июля 2009

Простой способ запретить Lua собирать объект - это поместить этот объект в таблицу (назовите его uncollectable), а затем поместить эту таблицу в реестр Lua.

Другой вариант - использовать дополнительный уровень косвенности для каждого объекта Lua, т. Е. Использовать «легкие пользовательские данные». Легкие пользовательские данные указывают на указатель на объект C ++, и даже если легкие пользовательские данные собраны, базовый объект остается невредимым.

Эти объяснения довольно лаконичны, но я надеюсь, что с помощью Программирование на Lua вы можете превратить его в рабочий код.

...