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

kFk*_*kFk 3 c++ scripting lua garbage-collection 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
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)

输出: GC 后GC 之前的
init
父init

结果: obj被销毁后,'TestClass'实例在垃圾收集周期后仍然存活(未调用__finalize方法且未释放内存).它只在程序退出时销毁.
Moresome如果我使用类无父,垃圾收集正确.

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

luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass")[luabind::adopt(luabind::result)];
Run Code Online (Sandbox Code Playgroud)

我明白了:

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

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

小智 8

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

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