Я слышал, что объекты в Qt автоматически удаляют своих детей, я хочу знать, что произойдет в этих ситуациях.
#include <QApplication>
#include <QLabel>
#include <QHBoxLayout>
#include <QWidget>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
/*
QLabel label("label"); // Program will crash. Destruct order is 1. widget, 2. layout, 3. label
QHBoxLayout layout; // But layout will be deleted twice
QWidget widget;
*/
QWidget widget; // Program doesn't seem to crash but is it safe ? Does Qt use
QHBoxLayout layout; // delete to operate on already destructed children ?
QLabel label("label");
layout.addWidget(&label); // layout is label parent
widget.setLayout(&layout); // widget is layout parent
widget.show();
return app.exec();
}
Разрешено ли это в Qt? Что делает Qt при уничтожении ребенка?
Кстати, я рассматривал использование интеллектуальных указателей, таких как shared_ptr. Но я думаю, что Qt также удалит объект, который уже был уничтожен интеллектуальным указателем тоже.
Я знаю, что вы хотели бы использовать new для распределения динамической памяти для объектов. Но я не чувствую его обнадеживающим, скажите, пожалуйста, если есть какие-либо ситуации (например, исключения), которые приведут к утечкам памяти, когда они будут полагаться на дерево объектов Qt для обработки динамической памяти?
Если я использую объекты, а не указатели, для динамического выделения объектов, я должен учитывать порядок уничтожения объектов, если они имеют право собственности, что является утомительным. Я не знаю, хорошо ли использовать динамическую память в Qt.
Есть ли у вас предложения или лучшие решения?