EgoRusMarch
@EgoRusMarch
C++ Developer

Qt. Для чего нужно, а для чего не нужно освобождать память?

Никак не могу понять, как это работает в Qt.
56720ea727c14090b608ee1ed73e91aa.png
Нужно ли объекты верхнего уровня (this) создавать динамически (все таки порядок создания и уничтожения может быть разным и тогда стек тут нельзя применять)? Если да, то как получается, что все объекты нижнего уровня освобождают память автоматически? Нужно ли для объекта верхнего уровня применять delete?

Пример:

есть класс class Widget : public QWidget { };

Как правильнее создавать объект верхнего уровня?:
такWidget Base;
или Widget *Base = new Widget;

Предполагаю, что все-таки динамически нужно, но тогда нужно ли освобождать?
delete Base;

И как происходит освобождение всей иерархии, которая наследуется от Base? Где вызывается деструктор, который очищает память? Не в Widget же? Или MOC создает самостоятельно часть кода для освобождения?
Если так, то что, если я создам явный деструктор? Придется ли освобождать память для иерархии теперь уже самому?
  • Вопрос задан
  • 1237 просмотров
Решения вопроса 2
Rou1997
@Rou1997
Как правильнее создавать объект верхнего уровня?:
такWidget Base;
или Widget *Base = new Widget;

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

И как происходит освобождение всей иерархии, которая наследуется от Base?

В контейнере, то есть в родительском контроле или окне - там, куда вы помещаете ссылку на него.
Проще говоря, при закрытии окна вызывается деструктор из central widget, он в свою очередь - у дочерних контролов и т.д., получается конечная рекурсия.
Должно быть так.

но тогда нужно ли освобождать?

Стало быть, должно быть не нужно, но если провели эксперимент, посмотрели исходный код и видите, что такого нет, то просто реализуйте все это вручную при закрытии.
Ответ написан
vitali1995
@vitali1995
Для потомков QObject и QWidget (для которых установлено свойство parent) не нужно - они подчищаются автоматически. Для всего остального как обычно: вручную или умными указателями.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы