Хранение класса lua с родителем в luabind :: object - PullRequest
3 голосов
/ 21 декабря 2009

Использование C ++ , lua 5.1 , luabind 0.7-0.81

Попытка создать класс lua с parent и сохранить его в luabind :: object.

Lua

class 'TestClassParent'
function TestClassParent:__init()
    print('parent init\n')
end
function TestClassParent:__finalize()
    print('parent finalize\n')
end

class 'TestClass' (TestClassParent)
function TestClass:__init()
    print('init\n')
    TestClassParent.__init(self)
end
function TestClass:__finalize()
    print('finalize\n')
end

C ++

{
    luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass");
}
printf("before GC\n");
lua_gc(lua, LUA_GCCOLLECT, 0);
printf("after GC\n");

выход
INIT * 1024. * родительский инициатор
до GC
после GC

Результат: После уничтожения объекта obj экземпляр «TestClass» остается активным после цикла сборки мусора (метод __finalize не вызывается и память не освобождается). Уничтожается только при выходе из программы.
Больше Если я использую класс без родителя, мусор собирается правильно.

Если я пытаюсь использовать принять политику (чтобы стать владельцем созданного объекта)

luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass")[luabind::adopt(luabind::result)];

Я получаю:

  • in luabind 0.7 - тот же результат, что и без политики принятия
  • in luabind 0.81 - сбой с сообщением «вы пытаетесь использовать незарегистрированный тип»

Как правильно создать объект lua в C ++ и взять его в собственность ?

Ответы [ 3 ]

8 голосов
/ 22 декабря 2009

Это известная ошибка в 0.8.1; ссылка на последний созданный объект остается в значении "super" функции upvalue. Это было исправлено в 0.9-rc1:

http://github.com/luabind/luabind/commit/2c99f0475afea7c282c2e432499fd22aa17744e3

1 голос
/ 21 декабря 2009

Редактировать : после обновления ОП этот ответ больше не актуален, но я оставлю его здесь висеть. Даниэль Валлин написал правильный ответ

не совсем ответ, но я бы потерял форматирование с комментарием

Я не могу воспроизвести это. Вот точный код, который я использую:

// initialization
lua_State* lua = lua_open();
luaL_openlibs(lua);
luabind::open(lua);
// declare class
luaL_loadstring(lua, 
    "class 'TestClass'\
     function TestClass:__init() print('init') end\
     function TestClass:__finalize() print('finalize') end");
lua_pcall(lua, 0, LUA_MULTRET, 0);
// instantiate
{
    luabind::object obj = luabind::call_function<luabind::object>(lua, "TestClass");
}
// collect
printf("Before GC collect\n");
lua_gc(lua, LUA_GCCOLLECT, 0);
printf("After GC collect\n");
lua_close(lua);

И результат, который я получаю:

init
Before GC collect
finalize
After GC collect

Я использую lua 5.1.4, luabind 0.81 с VC8 (он же VS2005) SP1

0 голосов
/ 22 декабря 2009

Проблема не в luabind :: object. Это в классе образования. Но проблема еще не решена. Пожалуйста, смотрите соответствующий вопрос - Проблема получения класса Luabind (утечка памяти)

...