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