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

2023-12-03

Using C++, lua 5.1, 鲁宾德 0.7-0.81

尝试创建一个具有父级的 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");

Output:
init
父初始化
气相色谱前
气相色谱后

Result:obj 被销毁后,“TestClass”实例在垃圾回收周期后仍然存在(未调用 __finalize 方法且未释放内存)。它仅在程序退出时销毁。
Moresome如果我使用没有父类的类,垃圾会被正确收集。

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

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

I get:

  • in 鲁宾德 0.7- 与不采用策略的结果相同
  • in 鲁宾德 0.81- 崩溃并显示消息“您正在尝试使用未注册的类型”

我怎样才能正确在C++中创建一个lua对象 and 取得它的所有权?


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 luabind::object 中存储带有父级的 lua 类 的相关文章

随机推荐