2009-12-21 83 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