使用 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
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 如果我使用没有父级的类,则会正确收集垃圾。
如果我尝试使用采用政策(取得已创建对象的所有权)
luabind::object obj = luabind::call_function<luabind::object>(lua_state, "TestClass")[luabind::adopt(luabind::result)];
我明白了:
如何正确在C ++中创建lua对象并取得所有权?
答案 0 :(得分:8)
这是0.8.1中的已知错误;对最后构造的对象的引用保留在“超级”函数upvalue中。它已修复为0.9-rc1:
http://github.com/luabind/luabind/commit/2c99f0475afea7c282c2e432499fd22aa17744e3
答案 1 :(得分:1)
编辑:OP更新后,这个答案已经不再适用了,我会把它留在这里。 Daniel Wallin发布了正确答案
不是一个真正的答案,但我会通过评论
丢失格式我无法重现这个。这是我使用的确切代码:
// initialization
lua_State* lua = lua_open();
luaL_openlibs(lua);
luabind::open(lua);
// declare class
luaL_loadstring(lua,
"class 'TestClass'\
function TestClass:__init() print('init') end\
function TestClass:__finalize() print('finalize') end");
lua_pcall(lua, 0, LUA_MULTRET, 0);
// instantiate
{
luabind::object obj = luabind::call_function<luabind::object>(lua, "TestClass");
}
// collect
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
答案 2 :(得分:0)
问题不在luabind :: object中。它是在类推导中。 但问题还没有解决。请参阅相应的问题 - Luabind class deriving problem (memory 'leak')