Делаю программу, в которой нужно запускать терминальные команды в самодельном эмуляторе консоли. Происходит это с помощью «вспомогательного» класса CommandRun и класса-диалога ConsoleEmulator .
В классе основного окна MainWindow создан приватный член класса CommandRun:
CommandRun *syncroCommandRun;
В конструкторе MainWindow он инициализируется и запоминается в глобальный объект globalParameters.
syncroCommandRun=new CommandRun( this );
globalParameters.setSyncroCommandRun( syncroCommandRun );
Класс 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
Те же файлы на dropmefiles: https://dropmefiles.com/s92FS