内存未释放 - PyQt4

Posted

技术标签:

【中文标题】内存未释放 - PyQt4【英文标题】:Memory not deallocated - PyQt4 【发布时间】:2011-03-17 16:19:42 【问题描述】:

可能是绑定 (SIP) 甚至是 python,但我遇到了 Qt (pyqt4) 的问题。

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

我有一个分配大约 400mb 内存的小部件。我没有设置父母,我打电话给deleteLater() 关闭但没有任何反应。连调用python的gc都不行:

导入 gc gc.collect()

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

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

谢谢

【问题讨论】:

【参考方案1】:

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

至少你不会得到像 C++ 这样的悬空引用,这会导致一些令人讨厌的崩溃......


这实际上很有用 - 如果您创建一个包含其成员的类级别列表的类,您可以回收旧对象并且永远不会将它们作为垃圾回收

【讨论】:

那么我为什么可以使用 deleteLater() 这样当我关闭选项卡时,我在打开新选项卡时不会分配更多。我认为这很奇怪,当我可以用新的小部件(选项卡)“替换”它时,内存分配被保持在 1.6GB。当您可以“替换”时,为什么不取消分配? @Johannes :deleteLayer 不会删除除 PyQt 处理层的内部引用之外的任何引用。寻找您丢失的参考资料。他们在那里,或者你在 PyQt 中发现了一个错误。他们在那里的可能性要大得多。我为这个问题浪费了一天的时间,但它教会了我要更加小心我的命名空间...... 可能是小部件引用了从程序的其他部分引用的某些对象?因为小部件,没有被任何其他地方引用,但它的组件和“数据”可能是。 是的,可能就是这样,PyQt 中有很多与 C++ 做事方式有关的“怪癖”,这与 python 做事的方式不同。它的“组件”之一或它的一些“数据”完全有可能引用它,从而阻止它被垃圾收集。如果我对您的小部件有更多了解,我可能会为您指明正确的方向;但是我会理解它是否敏感。 如您所说,这是一个“循环引用问题”。但修复它比发现错误更复杂。现在我至少知道是什么原因造成的。非常感谢。

以上是关于内存未释放 - PyQt4的主要内容,如果未能解决你的问题,请参考以下文章

不能使用释放或自动释放。出现黄色警告:内存泄漏和未使用的变量

程序结束后未释放的内存会怎样? [复制]

工作人员完成后 Sidekiq 未释放内存

如何为 3D 矢量中未使用的元素释放内存?

linux释放内存空间

后退按钮后未释放 UITableViewCell 的 UIImage 的内存