【问题标题】:python nested function memory leak?python嵌套函数内存泄漏?
【发布时间】:2012-08-07 19:35:19
【问题描述】:

根据之前的 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 隔离开来,您还有哪些其他建议?

【问题讨论】:

  • 特别是,我认为this answer 拥有您需要的所有信息。
  • 很有帮助,虽然他的帖子不像我希望的那样技术性。如果 python 有一个更复杂的(或更好地调整 GC 以循环引用 GUI),那就太好了。否则我需要等到我完成第一个项目才能了解它的能力。

标签: python function memory nested memory-leaks


【解决方案1】:

你可以调用 parent,因为它是自己的/派生的方法

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 实例是方法的字典,包含所有派生类的所有方法,因此您可以从任何范围访问它们。

这也回答了您关于 GC 的第一个问题,即只有一个引用,子类的 self 也是父类的 self,派生类也一样。

更进一步。从孩子您可以调用parent_object.show(self),因为show(self) 将是具有参数self 的静态方法,以显式告诉在实例self 上使用哪个类的方法。

self 只是实例

【讨论】:

  • 那么您是否建议显示父窗口静态调用该方法?你能用代码展示一个例子吗?对我来说,这个例子似乎只显示了子窗口(也许我误解了)。
【解决方案2】:

我发现弱引用是一个很好的解决方案。

这意味着“父”GUI 窗口包含对后续“子”GUI 窗口的强引用,并且在必要时,每个子窗口都包含对父窗口的弱引用。

然后,当父级从内存中删除时,子级也将被删除,因为不存在循环引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2012-12-02
    • 2011-12-13
    • 2014-02-26
    • 2010-11-27
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多