2009-12-21 81 views
3

使用C++LUA 5.1luabind 0.7-0.81在luabind存储一个LUA类与父::对象

试图创建一个父类LUA并将其存储在一个luabind ::目的。

的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)]; 

我得到:

  • luabind 0.7 - 相同的结果,而不会采取政策
  • in luabind 0.81 - 崩溃消息“您正试图使用​​unregistrerd类型”

我该如何正确创建C++一个Lua对象和把它的所有权

回答

8

这是0.8.1中的一个已知错误;对最后构造的对象的引用保留在“超级”函数中。它已被固定在0.9-RC1:

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

+0

这是关于这里描述的问题 - http://stackoverflow.com/questions/1946465/luabind-class-deriving-problem-memory-leak? – kFk 2009-12-22 15:19:57

+2

是的,这是相同的错误。 – 2009-12-22 23:59:42

1

编辑:在OP更新之后,这个答案不再相关,我会把它留在这里。丹尼尔·瓦林公布正确答案

不是一个真正的答案,但我会失去的格式与评论

我不能重现此一个。下面是我用的是确切的代码:

// 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

+0

非常感谢您的测试。你是对的。我对问题的描述不正确。只有当班级有家长时才是实际的。我已在主帖子中更新了描述。 – kFk 2009-12-22 12:29:53