Python 内存未释放-PyQt4

Python 内存未释放-PyQt4,python,qt,garbage-collection,pyqt4,Python,Qt,Garbage Collection,Pyqt4,可能是绑定(SIP)甚至python,但我对Qt(pyqt4)有一个问题 我有一个QTabWidget,在它里面我放置了可以关闭的widget 我有一个小部件,可以分配大约400mb的内存。我没有设置父级,我在关闭时调用了deleteLater(),但什么也没发生。即使调用python的gc也不起作用: import gc gc.collect() 导入gc gc.collect() 现在,当不使用deleteLater()从QTabWidget关闭小部件时,会分配越来越多的内存。比如说,我打开

可能是绑定(SIP)甚至python,但我对Qt(pyqt4)有一个问题

我有一个QTabWidget,在它里面我放置了可以关闭的widget

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

import gc gc.collect() 导入gc gc.collect() 现在,当不使用
deleteLater()
从QTabWidget关闭小部件时,会分配越来越多的内存。比如说,我打开了内存大的小部件的4个选项卡,我使用了大约1.6GB的内存。如果我将它们全部关闭,然后打开一个新的,我现在的内存使用量将达到2GB

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


谢谢

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

<>至少你不会有一个悬空的引用,比如C++,这会导致一些严重的崩溃……

这实际上是很有用的-如果您创建一个具有类级成员列表的类,您可以回收旧对象,并且永远不会对它们进行垃圾收集

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