c++ - 在 luabind::object 中存储一个带有父类的 lua 类

标签 c++ scripting garbage-collection lua luabind

使用C++, lua 5.1, luabind 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");

输出:
初始化
父初始化
GC之前
GC之后

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

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

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

我得到:

  • luabind 0.7 - 与没有采用策略的结果相同
  • luabind 0.81 中 - 崩溃并显示消息“您正在尝试使用未注册的类型”

如何正确地在 C++ 中创建一个 lua 对象取得它的所有权

最佳答案

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

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

关于c++ - 在 luabind::object 中存储一个带有父类的 lua 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1939864/

相关文章:

powershell - 非终止错误处理-if $ Error.count和$ ErrorActionPreference = 'stop'之间的区别

java - 如何防止对象被垃圾收集?

c# - C++ 到 C# : Pointers & Arrays

c++ - ASAN 检测到与动态加载的库共享的类的 vtable 的 ODR 违规

c# - 关闭 IActiveScript 引擎抛出 E_UNEXPECTED 异常

linux shell 日期问题

java - 为什么在 java 的垃圾收集中会发生这种情况

Java就是这个垃圾收集器

c++ - std::vector 指针可靠吗?

c++ - 如何在 Visual C++ 2008 中查找未使用的属性/方法