在luabind :: object中存储与父级的lua类

时间:2009-12-21 12:33:44

标签: c++ scripting garbage-collection lua luabind

使用 C ++ lua 5.1 luabind 0.7-0.81

尝试使用parent创建lua类并将其存储在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");

输出
初始化
父母初始 在GC之前 GC之后

结果: obj被销毁后,'TestClass'实例在垃圾收集周期后仍处于活动状态(未调用__finalize方法且未释放内存)。它仅在程序退出时销毁 Moresome 如果我使用没有父级的类,则会正确收集垃圾。

如果我尝试使用采用政策(取得已创建对象的所有权)

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

我明白了:

  • in luabind 0.7 - 与没有采纳政策相同的结果
  • in luabind 0.81 - 崩溃并显示消息“您正在尝试使用unregistrerd类型”

如何正确在C ++中创建lua对象取得所有权

3 个答案:

答案 0 :(得分:8)

这是0.8.1中的已知错误;对最后构造的对象的引用保留在“超级”函数upvalue中。它已修复为0.9-rc1:

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

答案 1 :(得分:1)

编辑:OP更新后,这个答案已经不再适用了,我会把它留在这里。 Daniel Wallin发布了正确答案

不是一个真正的答案,但我会通过评论

丢失格式

我无法重现这个。这是我使用的确切代码:

// 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

答案 2 :(得分:0)

问题不在luabind :: object中。它是在类推导中。 但问题还没有解决。请参阅相应的问题 - Luabind class deriving problem (memory 'leak')