2009-12-17 28 views
3

存在對象的問題,不再需要但仍有引用。 結果:由於未收集對象,分配內存的大小不斷增長。Lua中失去引用

如何解決這類問題? 有沒有什麼方法可以找到只有一個引用的對象,或者一生中超過某個值的對象?還是有其他解決方案?

在luabind中使用Lua 5.1和C++。

謝謝。

+1

你有沒有機會保持或泄漏luabind :: object實例? – sbk 2009-12-17 17:31:22

+0

也許保持。不會泄漏,因爲所有的luabind :: object實例都是在堆棧中創建的,並且C++代碼中沒有這樣的泄漏。 – kFk 2009-12-18 08:52:18

回答

1

我不確定如何將它與C++集成,但它聽起來像垃圾收集器沒有被給予運行的機會。

在你的lua中,你可以嘗試明確地調用它,看看是否有幫助。核心apis collectgarbage(opt [, arg])中有一個功能。

+0

垃圾收集定期運行,並做得很好。但它不會收集具有現有參考的對象。有很多這樣的對象,我找不到它們。 – kFk 2009-12-17 15:35:10

+0

您是否患有循環引用問題? – 2009-12-17 16:16:30

+0

lua是否正確解決循環引用?如果否,可能是原因。 – kFk 2009-12-18 08:50:30

5

有人在這裏提到,你可以嘗試使用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 
+0

弱表是一個很好的機制,但如何找到在弱表中使用適當的對象?項目中有大約2Mb的lua代碼,找到哪些對象沒有被釋放並且仍然有參考是有問題的。將所有錶轉換爲弱表將導致對象過早銷燬。此外,表格主要用於取得對象的所有權並僅在必要時釋放它們。問題是,並非所有的參考文獻都已發佈,我無法找到它們。 – kFk 2009-12-19 17:13:57

+0

如果您不確定哪些表應該很弱,那麼您唯一的工作方式是將所有引用設置爲零,當它們停止有用時。 我建議您爲所有「類」(表格類型)實施「析構函數」方法。應該在不再需要的對象上調用這個析構函數方法,並且應該等於它們對nil的引用。另外,對於「對象列表」,實現一個「釋放」方法,將nil分配給引用。 – kikito 2009-12-21 10:54:44