Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: kamil от Февраль 14, 2016, 14:23



Название: Тройной вызов деструктора при закрытии приложения
Отправлено: kamil от Февраль 14, 2016, 14:23
Я заметил что при отладке возникает странная ситуация, когда в стеке вызывов функций деструкторы некоторых объектов якобы вызываются три раза. Примерно так:
(http://zaripov.net/31.png)
Но по факту только один раз.
Если поставить брекпойнт на входе в деструтор картина такая:
попадаешь во вход деструктора, при попытке сделать следующий шаг, снова попадаешь во вход деструктора, в стеке вызовов это появляется второй вызов деструктора. Снова делаешь шаг и снова попадаешь в тот же деструктор, в стеке вызовов уже третий вызов. Дальше все идет как обычно - проходишь шагами по всем командам в деструторе, выходишь из третьего вызова деструкора, и дальше попадаешь во втрой, в нем прыгаешь с самого начала на самый конец, и с первым вызовом так же.

Это баг отладчика, или так и должно быть, и я что-то не понимаю?


Название: Re: Тройной вызов деструктора при закрытии приложения
Отправлено: Igors от Февраль 14, 2016, 14:28
Использую другие IDE и компилятор, но то же самое - оборачивает деструктор еще в неск вызовов. Зачем - хз, ну наверное "так надо"


Название: Re: Тройной вызов деструктора при закрытии приложения
Отправлено: Old от Февраль 14, 2016, 14:39
Это баг отладчика, или так и должно быть, и я что-то не понимаю?
А покажите что там в деструкторе в строках 47 и 48.


Название: Re: Тройной вызов деструктора при закрытии приложения
Отправлено: kamil от Февраль 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 }

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

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


Название: Re: Тройной вызов деструктора при закрытии приложения
Отправлено: kambala от Февраль 15, 2016, 00:05
вина это отладчика или нет очень легко проверить с помощью qDebug


Название: Re: Тройной вызов деструктора при закрытии приложения
Отправлено: kamil от Февраль 15, 2016, 01:50
вина это отладчика или нет очень легко проверить с помощью qDebug

Да, действительно, qDebug вызывается только один раз. Так что я думаю что это просто баг gdb.