Как освободить память, выделенную под создание второго окна в Qt?

Я создаю новое окно в программе при нажатии на кнопку следующим образом (оба окна принадлежат классу QMainWindow):

void MainWindow::on_pushButton_clicked()
{
        ImageViewer* imgV = new ImageViewer;
        imgV->show();
}

Как грамотно освободить память, выделенную под хранение объекта класса нового окна? Если прописать delete сразу после вызова show(), оба окна закроются. Также мне не доступен метод exec(), так как второе окно принадлежит классу (как было сказано выше) QMainWindow.


Ответы (1 шт):

Автор решения: Bearded Beaver

Для автоматического удаления окна при закрытии ему надо установить соответствующий атрибут:

void MainWindow::on_pushButton_clicked()
{
        ImageViewer* imgV = new ImageViewer;
        imgV->setAttribute(Qt::WA_DeleteOnClose);   // <- вот этот
        imgV->show();
}

Подробнее тут: https://doc.qt.io/qt-5/qt.html#WidgetAttribute-enum

Для полноты ответа добавлю, если время жизни дочернего объекта должно заканчиваться с окончанием времени жизни родителя, то проще всего оставить работу с памятью фреймворку. Для этого в конструктор дочернего окна надо передать указатель на родителя:

ImageViewer* imgV = new ImageViewer(this);

В этом случае при удалении текущего окна, окно imgV удалится автоматически, как и все его дочерние объекты вниз по иерархии.

→ Ссылка