2012-08-07 68 views
2

從以前的java經驗,我知道,如果兩個GUI類對象包含對方的成員變量引用,可能會有內存泄漏,直到兩個對象被銷燬。python嵌套函數內存泄漏?

這種情況是非常混亂的調試,所以我想與嚴格的指導方針,以避免現在在python內存泄漏。

我現在有一個GUI系統,其中有一個主窗口(parent_window),並彈出一個帶有用戶輔助選項許多子窗口(子窗口)等

我想到了一個簡單的方法來防止內存泄漏是不要在所有子窗口中保留父窗口的類成員變量。

class child_window(object): 
    def make_child_window(self, parent_window): 
     def on_ok(): parent_window.show() 
     QtCore.QObject.connect(self.okbutton, QtCore.SIGNAL("clicked()"), on_ok) 

,你可以看到,我有一個調用它僅包含在類方法(「make_child_window」)的局部範圍parent_window一個嵌套函數。這是作弊嗎?在較低的水平python實質上存儲我的「parent_window」作爲類變量?你有什麼其他的建議將child_window從內存中的parent_window中分離出來?

+1

請參閱[我應該擔心Python中的循環引用?](http://stackoverflow.com/questions/2428301/should-i-worry-about-circular-references-in-python)。 – 2012-08-07 19:44:41

+0

特別是,我認爲[這個答案](http://stackoverflow.com/a/2428888/600110)有你需要的所有信息。 – 2012-08-07 20:12:27

+0

很有幫助,雖然他的帖子不像我想要的那麼技術性。如果python有一個更復雜的(或更好地調整GC的循環引用的GUI),那麼很好。否則,病態需要等到我完成這個第一個項目才能掌握它的能力。 – ecoe 2012-08-08 15:36:24

回答

1

你可以調用父,因爲它是自己的/導出方法

class child_window(object): 
    def make_child_window(self): # no need for parent 
     def on_ok(): self.show() #no need for parent 
     QtCore.QObject.connect(self.okbutton, QtCore.SIGNAL("clicked()"), on_ok) 

這工作,因爲自我實例方法字典,幷包含所有派生類的所有方法,所以你可以從任何範圍訪問它們。

這也回答了你關於GC的第一個問題,那就是隻有一個引用,並且child的self對於parent也是self,對於派生類是相同的。

更進一步。從孩子你可以撥打parent_object.show(self)作爲show(self)將靜態方法具有參數self明確告訴從哪個類使用方法實例self

self只是實例

+0

所以你建議顯示父窗口靜態調用方法?你能在代碼中展示一個例子嗎?對我來說這個例子似乎只是顯示子窗口(也許我是誤解)。 – ecoe 2012-08-08 15:40:24

0

我發現弱引用是一個優秀的解決方案。

這意味着「父」GUI窗口包含後續「子」GUI窗口的強引用,並且必要時每個子都包含父引用。

然後,當父母被移出內存時,孩子也是如此,因爲沒有循環引用存在。