python - 内存未释放 - PyQt4

标签 python qt garbage-collection pyqt4

它可能是绑定(bind) (SIP) 甚至是 python,但我对 Qt (pyqt4) 有疑问。

我有一个 QTabWidget,我在里面放了一些可以关闭的小部件。

我有一个分配大约 400mb 内存的小部件。我没有设置父级,我在关闭时调用了 deleteLater() 但没有任何反应。即使调用 python 的 gc 也不起作用:

import gc
gc.collect()

现在,当不使用 deleteLater() 从 QTabWidget 关闭小部件时,会分配越来越多的内存。所以假设我打开了内存密集型小部件的 4 个选项卡,我使用了大约 1.6GB 内存。如果我将它们全部关闭并打开一个新的,我现在的内存使用量高达 2GB。

如果我使用 deleteLater(),在关闭 4 个选项卡后,我打开一个新选项卡时没有达到 2GB,那么我必须打开 5 个选项卡。但是,这就是问题,即使关闭了所有小部件,仍然为进程 (python) 分配了 1.6GB,并且调用了 deleteLater

谢谢

最佳答案

我有这个 - 在某个地方你有一个对你的小部件的引用,并且该引用已被计算在内......删除该小部件的唯一方法是确保没有剩余的引用,以便 python 可以对其进行垃圾收集。

至少你不会像 C++ 那样以悬空引用结束,这可能会导致一些严重的崩溃......


这实际上很有用——如果你创建一个类,它有一个类级别的成员列表,你可以回收旧对象,永远不会让它们被垃圾回收

关于python - 内存未释放 - PyQt4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5341954/

相关文章:

python - 如何仅获取时区的秒数偏移量

python - 了解 model.summary Keras

Qt - 专注于失去焦点的应用程序?

c++ - 将 Q_GADGET 中的 Q_INVOKABLE 公开给 QML

python - 迭代数据库结果时如何在应用程序引擎(python)中收集内存垃圾

python - Windows XP 上的 RSSI 与 pyBluez

python - 利用 Pandas 功能/使代码更 Pythonic 来重写 excel 宏

c++ - 禁用 QGraphicsWebView 滚动条

java - 有没有办法知道哪些对象在堆的 "old"区域

java - 调用 System.gc() 是否会重置分代收集的统计数据?