2012-08-07 42 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窗口的强引用,并且必要时每个子都包含父引用。

然后,当父母被移出内存时,孩子也是如此,因为没有循环引用存在。