【发布时间】:2010-12-28 17:35:14
【问题描述】:
使用 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 方法没有被调用,内存也没有被释放)。它只在程序退出时销毁。
Moresome如果我使用没有父级的类,垃圾会被正确收集。
如果我尝试使用 adopt policy(获取已创建对象的所有权)
luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass")[luabind::adopt(luabind::result)];
我明白了:
- 在 luabind 0.7 - 与没有采用策略的结果相同
- 在 luabind 0.81 - 崩溃并显示消息“您正在尝试使用未注册类型”
如何正确在 C++ 中创建一个 lua 对象并获取它的所有权?
【问题讨论】:
标签: c++ scripting garbage-collection lua luabind