存在對象的問題,不再需要但仍有引用。 結果:由於未收集對象,分配內存的大小不斷增長。Lua中失去引用
如何解決這類問題? 有沒有什麼方法可以找到只有一個引用的對象,或者一生中超過某個值的對象?還是有其他解決方案?
在luabind中使用Lua 5.1和C++。
謝謝。
存在對象的問題,不再需要但仍有引用。 結果:由於未收集對象,分配內存的大小不斷增長。Lua中失去引用
如何解決這類問題? 有沒有什麼方法可以找到只有一個引用的對象,或者一生中超過某個值的對象?還是有其他解決方案?
在luabind中使用Lua 5.1和C++。
謝謝。
有人在這裏提到,你可以嘗試使用weak tables。
如果你有像這樣的代碼:
myListOfObjects = {}
...
table.insert(myListOfObject, anObject)
然後,一旦被使用anObject
停止,它永遠不會被釋放,因爲myListOfObjects
仍然引用它。
你可以嘗試去除myListOfObjects
參考(設定參考爲零),但一個簡單的解決方案正在申報myListOfObjects
爲弱表:
myListOfObjects = {}
setmetatable(myListOfObjects, { __mode = 'v' }) --myListOfObjects is now weak
鑑於setmetatable
返回表中的引用它修改,你可以使用這個較短的成語,這與前兩行相同:
myListOfObjects = setmetatable({}, {__mode = 'v' }) --creation of a weak table
弱表是一個很好的機制,但如何找到在弱表中使用適當的對象?項目中有大約2Mb的lua代碼,找到哪些對象沒有被釋放並且仍然有參考是有問題的。將所有錶轉換爲弱表將導致對象過早銷燬。此外,表格主要用於取得對象的所有權並僅在必要時釋放它們。問題是,並非所有的參考文獻都已發佈,我無法找到它們。 – kFk 2009-12-19 17:13:57
如果您不確定哪些表應該很弱,那麼您唯一的工作方式是將所有引用設置爲零,當它們停止有用時。 我建議您爲所有「類」(表格類型)實施「析構函數」方法。應該在不再需要的對象上調用這個析構函數方法,並且應該等於它們對nil的引用。另外,對於「對象列表」,實現一個「釋放」方法,將nil分配給引用。 – kikito 2009-12-21 10:54:44
你有沒有機會保持或泄漏luabind :: object實例? – sbk 2009-12-17 17:31:22
也許保持。不會泄漏,因爲所有的luabind :: object實例都是在堆棧中創建的,並且C++代碼中沒有這樣的泄漏。 – kFk 2009-12-18 08:52:18