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().
欲了解更多信息,请阅读:
| 归档时间: |
|
| 查看次数: |
1605 次 |
| 最近记录: |