Позвольте мне просто процитировать источник здесь.
816 QObject::~QObject()
817 {
818 Q_D(QObject);
819 d->wasDeleted = true;
820 d->blockSig = 0; // unblock signals so we always emit destroyed()
821
...
924
925 if (!d->children.isEmpty())
926 d->deleteChildren();
927
928 qt_removeObject(this);
929
930 if (d->parent) // remove it from parent object
931 d->setParent_helper(0);
932
933 #ifdef QT_JAMBI_BUILD
934 if (d->inEventHandler) {
935 qWarning("QObject: Do not delete object, '%s', during its event handler!",
936 objectName().isNull() ? "unnamed" : qPrintable(objectName()));
937 }
938 #endif
939 }
...
1897 void QObjectPrivate::deleteChildren()
1898 {
1899 const bool reallyWasDeleted = wasDeleted;
1900 wasDeleted = true;
1901 // delete children objects
1902 // don't use qDeleteAll as the destructor of the child might
1903 // delete siblings
1904 for (int i = 0; i < children.count(); ++i) {
1905 currentChildBeingDeleted = children.at(i);
1906 children[i] = 0;
1907 delete currentChildBeingDeleted;
1908 }
1909 children.clear();
1910 currentChildBeingDeleted = 0;
1911 wasDeleted = reallyWasDeleted;
1912 }
Итак, как вы можете видеть, QObject
действительно delete
каждый из его дочерних элементов в деструкторе. Кроме того, деструктор выполняется перед деструкторами любых членов; так что если рассматриваемый состав равен родителю, то у члена QObject
не будет возможности удалить себя из списка дочерних элементов своего родителя.
Это, к сожалению, означает, что вы не можете составить QObject
в его родителя . Но вы можете создавать другие объекты, а также размещать их в стеке - как только вы гарантируете уничтожение объекта или сброс его родителя на 0 до того, как родитель начнет разрушать.