И это всё МОЁ

Делаю программу, в которой нужно запускать терминальные команды в самодельном эмуляторе консоли. Происходит это с помощью «вспомогательного» класса CommandRun и класса-диалога ConsoleEmulator .

В классе основного окна MainWindow создан приватный член класса CommandRun:

CommandRun *syncroCommandRun;

В конструкторе MainWindow он инициализируется и запоминается в глобальный объект globalParameters.
syncroCommandRun=new CommandRun( this );
globalParameters.setSyncroCommandRun( syncroCommandRun );
(Этот globalParameters по сути ничего не делает, просто помнит указатель, проблема не в нем).

Класс CommandRun унаследован от QObject. При создании объекта syncroCommandRun конструктору передается указатель на родительский объект this, поэтому в деструкторе MainWindow никаких команд delete нет, потому что этот объект должен сам корректно удалиться как дочерний для MainWindow. Это обычное дело для Qt.

Если запустить демонстрационный пример, и сразу нажать кнопку закрытия окна [x], то закрытие программы произойдет нормально, без ошибок.

Если же запустить демонстрационный пример, нажать в нем кнопку Run (мигнет окно запуска процесса), и нажать кнопку закрытия окна [x], то в консоль будет выдано:
Программа неожиданно завершилась.

Если проделать то же самое под дебаггером, то будет видно, что по какой-то причине два раза вызывается деструктор объекта syncroCommandRun. Вот скриншот:

https://anonfiles.com/18F8h8u7oe/_2020-04-28_16-11-44_png

Я не пойму, почему так происходит.

Демонстрационный пример тут: https://anonfiles.com/R541h7udoc/qtSample_zip








 , , ,