когда luabind бесплатно создает объекты? - PullRequest
0 голосов
/ 16 января 2011

У меня проблемы с luabind. Я определяю std :: map для размещения объектов, созданных в lua. Я публикую эту карту как глобальный объект в lua следующим образом:

luabind::globals(L)["g_SceneManager2D"] = this;

После этого этот объект используется в функции в lua, где многие объекты создаются и вставляются в эту карту. Проблема возникает, когда функция lua заканчивается, и luabind возвращает элемент управления сторонней программе на C ++, потому что автоматически все содержимое карты теряется.

Я искал ошибку. Я поддерживаю контекст lua, поэтому этот объект должен существовать.

Не могли бы вы помочь мне?

Большое спасибо:)

Ответы [ 2 ]

1 голос
/ 17 января 2011

Если я правильно понимаю вашу проблему, кажется, вы создаете объекты в Lua, которые затем вставляете в карту (либо через Lua или C ++), а затем теряете.Без дополнительного кода трудно точно сказать, в чем проблема.Однако сначала я хотел бы убедиться, что эти объекты действительно создаются (дважды проверьте его), а затем я проверю, чтобы Lua не собирал их мусором.Если Lua действительно собирает эти объекты, то вы не увидите их на стороне C ++, потому что они, ну, в общем, ушли.

Если это поможет, я заканчиваю проект, который делает нечто подобное,Мне пришлось создавать и извлекать объекты C ++ из Lua, но вместо того, чтобы создавать объекты в Lua, я просто вызывал функции C ++, чтобы сделать это для меня, отправляя любые необходимые данные в вызове Lua (связанном с Luabind).Эти функции (C ++) проиндексировали объекты по идентификаторам в хеш-таблицах, и идентификаторы были возвращены Lua на тот случай, если понадобится получить объектную часть сценария для операций.Эта настройка упрощает (и безопаснее) правильную обработку содержимого памяти и предотвращает сбор мусора вашими объектами Lua.

1 голос
/ 16 января 2011

Я предлагаю использовать shared_ptr<>(this) вместо сырых this. boost::shared_from_this может помочь. Убедитесь, что ваш класс зарегистрирован также с использованием Luabind, и что class_ указан как shared_ptr.

Другой забавной идеей может быть сделать так, чтобы ваша функция Lua просто генерировала «карту» в виде таблицы Lua, возвращала ее, и вы можете перебирать ее в C ++, чтобы создать свой std::map.

...