【发布时间】:2020-05-24 01:55:00
【问题描述】:
我想了解使用sip.delete() 和deleteLater() 删除小部件(包括它的布局和此布局中的子级)之间的区别。我知道removeWidget() 和setParent(None) 只是从布局中删除小部件,但并没有从内存中删除对象本身。如果我想从内存中删除一个对象,我应该使用哪个?我知道以前有人问过这个问题,但我希望得到详细的答案:)
【问题讨论】:
我想了解使用sip.delete() 和deleteLater() 删除小部件(包括它的布局和此布局中的子级)之间的区别。我知道removeWidget() 和setParent(None) 只是从布局中删除小部件,但并没有从内存中删除对象本身。如果我想从内存中删除一个对象,我应该使用哪个?我知道以前有人问过这个问题,但我希望得到详细的答案:)
【问题讨论】:
我建议您阅读this answer,因为我将使用其中解释的几个概念。
sip.delete() 用于直接从包装器调用 C++ 对象的析构函数,类似于:
delete wraper_instance->_cpp_object;
而deleteLater() 是QObjects 的一个方法,它发送一个事件,以便事件循环调用C++ 对象的析构函数,类似于:
为什么 QObjects 可以替代 deleteLater()? 好吧,直接删除 QObject 可能是不安全的,例如我们假设调用析构函数删除了某些 QWidget(它是 QObject)直接但在前一刻,在应用程序的另一部分,它要求更新整个 GUI,因为没有通知 GUI 删除对象将导致访问未分配的内存,从而导致应用程序崩溃。
因此,如果您想删除QObject,那么使用deleteLater() 会更安全,对于其他C++ 对象(如QImage、QPixmap、QGraphicsItems 等),您应该使用sip.delete()。
更多信息请阅读:
【讨论】: