Qt использует то, что они называют деревьями , и это немного отличается от типичного подхода RAII.
Конструктор QObject
class принимает указатель на родителя QObject
. Когда этот родитель QObject
будет уничтожен, его дети также будут уничтожены. Это довольно распространенный шаблон в классах Qt, и вы заметите, что многие конструкторы принимают параметр *parent
.
Если вы посмотрите на некоторые из примеров программ Qt , вы обнаружите, что они фактически создают большинство объектов Qt в куче и используют это дерево объектов для обработки уничтожения. Лично я нашел эту стратегию полезной, поскольку объекты GUI могут иметь своеобразное время жизни.
Qt не предоставляет никаких дополнительных гарантий помимо стандартного C ++, если вы не используете QObject
или подкласс QObject
(например, QWidget
).
В вашем конкретном примере нет гарантии, что что-либо будет удалено.
Вы захотите что-то подобное для Des
(при условии, что Des
является подклассом QWidget
):
class Des : public QWidget
{
Q_OBJECT
public:
Des(QWidget* parent)
: QWidget(parent)
{
QPushButton* push = new QPushButton("neu");
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(push); // this re-parents push so layout
// is the parent of push
setLayout(layout);
}
~Des()
{
// empty, since when Des is destroyed, all its children (in Qt terms)
// will be destroyed as well
}
}
И вы бы использовали класс Des
примерно так:
int someFunction()
{
// on the heap
Des* test = new Des(parent); // where parent is a QWidget*
test->show();
...
// test will be destroyed when its parent is destroyed
// or on the stack
Des foo(0);
foo.show();
...
// foo will fall out of scope and get deleted
}