将一个拥有父类的Lua类存储在luabind::object中

使用 C++lua 5.1luabind 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

parent init

before GC

after GC

结果: 在 obj 被销毁后,'TestClass' 实例虽然未经垃圾回收循环(__finalize 方法未被调用且内存未被释放)仍然存活,只有在程序退出时才会被销毁。

更糟糕的是,如果我使用无父类的类,则可以正确回收垃圾。

如果我尝试使用 adopt policy(使用它来拥有创建的对象)

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

我会得到:

  • luabind 0.7 中 - 与未使用 adopt policy 相同的结果
  • luabind 0.81 中 - 崩溃并显示“您正在尝试使用未注册的类型”

我该如何正确地 在 C++ 中创建 lua 对象并拥有它

原文链接 https://stackoverflow.com/questions/1939864

点赞
stackoverflow用户169828
stackoverflow用户169828

编辑:在 OP 的更新之后,这个答案已经不再相关了,但我还是把它留在这里。正确答案由 Daniel Wallin 提供。

并不是一个真正的答案,但我会用注释来失去格式

我无法复制这个。这是我使用的确切代码:

// 初始化
lua_State* lua = lua_open();
luaL_openlibs(lua);
luabind::open(lua);
// 声明类
luaL_loadstring(lua,
    "class 'TestClass'\
     function TestClass:__init() print('init') end\
     function TestClass:__finalize() print('finalize') end");
lua_pcall(lua, 0, LUA_MULTRET, 0);
// 实例化
{
    luabind::object obj = luabind::call_function<luabind::object>(lua, "TestClass");
}
// 收集
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。

2009-12-21 20:29:48
stackoverflow用户53249
stackoverflow用户53249

这是 0.8.1 版本中已知的 bug;在 "super" 函数的 upvalue 中留下了对上一个构建的对象的引用。它已经在 0.9-rc1 中得到修复:

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

2009-12-22 13:40:21