为什么QObjects不会被删除两次,如果它们同时是类成员和子类?

Dom*_*old 2 qt memory-leaks memory-management

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

这是一个例子:

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

MyWindow::MyWindow() : label(this) {}
Run Code Online (Sandbox Code Playgroud)

当一个实例MyWindow被销毁时,label应该删除两次,因为它是一个成员和一个孩子MyWindow.但这不会发生,这样做似乎是安全的.但它是如何工作的?

Fra*_*eld 5

这种情况适用于这种情况,因为删除顺序:

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