qt - 如果 QObjects 同时是类(class)成员和 child ,为什么不删除两次?

标签 qt memory-management memory-leaks

如果一个 QObject 是一个类的成员(不是用 new-operator 创建的)并且同时是类实例的 child ,它应该被删除两次,因为类实例的所有 child 都被删除并在类的析构函数中删除所有类成员。因此,程序应该崩溃。但这并没有发生,所以 Qt 必须以某种方式检测到这种双重关系。但这真的会发生吗?如果是,它是如何工作的?

这是一个例子:

class MyWindow : public QMainWindow {
Q_OBJECT
public:
    MyWindow();
    QLabel label;
};

MyWindow::MyWindow() : label(this) {}

MyWindow 的实例被销毁时,label 应该被删除两次,因为它是 MyWindow 的成员和子级。但这并没有发生,这样做似乎是安全的。但它是如何工作的?

最佳答案

这在这种情况下有效,因为删除顺序:

  1. ~MyWindow() 首先被调用,它破坏了标签。标签的 ~QObject() 析构函数从父级的子级列表中删除对象。
  2. 在 ~MyWindow() 之后,在某个时候调用 MyWindow 的 ~QObject() 析构函数,删除窗口的子项。但是,由于标签指针已从子列表中删除,因此不会尝试再次删除标签。

关于qt - 如果 QObjects 同时是类(class)成员和 child ,为什么不删除两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21561439/

相关文章:

汇编内存分配

ipad - 为什么我无法在应用程序崩溃的情况下释放我的 CTFramesetter?

c++ - 将数据从工作线程发送到 Qt 中的 gui 线程

c++ - QT:无法从另一个线程启用套接字通知程序

linux - 如何创建运行自定义生成事件的 Makefile 或 .pro 文件

c++ - 为什么知道字节流中的字节是什么?

c - 内存分配的递归

c++ - decltype(new any_type()) 是否可能发生内存泄漏?

android - 将 Activity 上下文传递给构造函数以在内部使用 - 这很糟糕吗

Java:泄漏原因未知(非常简单的示例)