根据之前的java经验,我知道如果两个GUI类对象包含彼此的成员变量引用,则在两个对象都被销毁之前可能存在内存泄漏。
这种情况调试非常混乱,所以我想使用严格的指导方针来避免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)
如您所见,我有一个嵌套函数调用parent_window,该函数仅包含在类方法的本地范围内(“make_child_window”)。这是作弊吗?在较低的层次上,python基本上将我的“parent_window”存储为类变量吗?你有什么建议将child_window隔离到内存中的parent_window?
答案 0 :(得分: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)
这是有效的,因为self instance是方法的字典,包含所有派生类的所有方法,因此您可以从任何范围访问它们。
这也回答了你关于GC的第一个问题,那就是只有一个引用,而且对于child,self也是self的父级,对于派生类也是如此。
更进一步。从孩子那里,您可以调用parent_object.show(self)
,因为show(self)
将是具有参数self
的静态方法,以明确告知哪个类在实例self
上使用方法。
self
只是实例
答案 1 :(得分:0)
我发现弱引用是一个很好的解决方案。
这意味着“父”GUI窗口包含后续“子”GUI窗口的强引用,并且必要时,每个子窗口都包含父项的弱引用。
然后,当父节点被移除内存时,子节点就不存在循环引用。