内存未释放 - PyQt4

3 投票
1 回答
1524 浏览
提问于 2025-04-16 13:54

可能是绑定的问题(SIP)或者是Python本身的问题,但我在使用Qt(pyqt4)时遇到了麻烦。

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

其中有一个控件大约占用400MB的内存。我没有设置父控件,并且在关闭时调用了deleteLater(),但没有任何反应。即使调用Python的垃圾回收(gc)也没用:

import gc
gc.collect()

现在,当我在QTabWidget中关闭这些控件而不使用deleteLater()时,内存使用量越来越多。比如说我打开4个占用内存较大的标签页,这样我大约会使用1.6GB的内存。如果我把它们都关掉,然后再打开一个新的,内存使用量就变成了2GB。

如果我使用deleteLater(),在关闭这4个标签页后,再打开一个新的,就不会到2GB,而是需要打开5个标签页。但这里有一个问题,即使所有控件都关闭了,并且调用了deleteLater,进程(Python)仍然占用着1.6GB的内存。

谢谢

1 个回答

2

我之前遇到过这样的情况——你有一个小部件的引用,这个引用是被计数的……要删除这个小部件,唯一的方法就是确保没有其他地方再引用它,这样Python才能把它清理掉。

至少你不会像在C++中那样遇到悬空引用的问题,这样可能会导致一些很糟糕的崩溃……


其实这也可以很有用——如果你创建一个类,并在这个类里有一个成员的列表,你就可以重复使用旧的对象,而不让它们被清理掉。

撰写回答