我想了解一下,在删除一个widget(包括它的布局和这个布局中的子节点)的时候,使用 sip.delete()
和 deleteLater()
. 我知道 removeWidget()
和 setParent(None)
只是将widget从layout中删除,但并没有从内存中删除对象本身。如果我想从内存中删除一个对象,我应该使用哪种方法?我知道这个问题以前有人问过,但我希望得到详细的回答:)
我推荐你阅读 本回答 因为我将使用那里解释的几个概念。
在这里,我想说的是 sip.delete()
是用来直接从包装器中调用C++对象的析构器的,类似这样。
delete wraper_instance->_cpp_object;
取而代之的是 deleteLater()
的方法。QObject
的事件,使事件循环调用C++对象的析构器,就像这样。
为什么QObjects有作为替代的 deleteLater()
? 好吧,直接删除一个QObject可能是不安全的,例如,我们假设某个QWidget(这是一个QObject)被直接调用destructor删除,但在应用程序的另一部分中,它要求更新整个GUI,因为GUI没有被通知删除对象,然后将导致未分配的内存被访问,导致应用程序崩溃。
因此,如果你想删除一个 QObject
那么使用 deleteLater()
对于其他C++对象(如QImage, QPixmap, QGraphicsItems等),你应该使用 sip.delete()
.
更多信息请阅读。