Russian Qt Forum
Ноябрь 23, 2024, 04:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Тройной вызов деструктора при закрытии приложения  (Прочитано 4180 раз)
kamil
Гость
« : Февраль 14, 2016, 14:23 »

Я заметил что при отладке возникает странная ситуация, когда в стеке вызывов функций деструкторы некоторых объектов якобы вызываются три раза. Примерно так:

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

Это баг отладчика, или так и должно быть, и я что-то не понимаю?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Февраль 14, 2016, 14:28 »

Использую другие IDE и компилятор, но то же самое - оборачивает деструктор еще в неск вызовов. Зачем - хз, ну наверное "так надо"
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Февраль 14, 2016, 14:39 »

Это баг отладчика, или так и должно быть, и я что-то не понимаю?
А покажите что там в деструкторе в строках 47 и 48.
Записан
kamil
Гость
« Ответ #3 : Февраль 14, 2016, 23:11 »

Это баг отладчика, или так и должно быть, и я что-то не понимаю?
А покажите что там в деструкторе в строках 47 и 48.

Код:
47 MainWindow::~MainWindow() {
48    auxiliaryThread().terminate();
49    settings().setValue( "locale/language", static_cast<uint>(language()) );
50    settings().setValue( "id", id().toString() );
51    settings().sync();
53    delete _ui;
52    auxiliaryThread().wait();
55 }

Но на самом деле в три приема вызываются многие деструкторы, и особой корреляции поведения с содержимым деструктора я не заметил.

Хорошо, если это просто особенность работы отладчика, и не проблема в моем коде, то я могу спать спокойно.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Февраль 15, 2016, 00:05 »

вина это отладчика или нет очень легко проверить с помощью qDebug
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kamil
Гость
« Ответ #5 : Февраль 15, 2016, 01:50 »

вина это отладчика или нет очень легко проверить с помощью qDebug

Да, действительно, qDebug вызывается только один раз. Так что я думаю что это просто баг gdb.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.