QObject деструкторы не вызывают

У меня два QObject дочерние классы в моем приложении Qt. Один объект из каждого из этих классов был создан в стеке. Раньше мое приложение выходило чисто. Однако, поскольку я обновился до Qt5.1.0, их деструкторы не вызываются. Я получаю следующее предупреждение дважды, когда запускаю отладчик.

the debug information found in "/usr/lib/debug//lib64/libfreebl3.so.debug" 
does not match "/lib64/libfreebl3.so" (CRC mismatch)

Это ошибка в Qt или в моем коде?

2 ответа

Решение

Смотрите документацию QCoreApplication::exec:

Мы рекомендуем подключать код очистки к сигналу aboutToQuit(), вместо того, чтобы помещать его в функцию main() вашего приложения, поскольку на некоторых платформах вызов QCoreApplication::exec() может не возвращаться. Например, в Windows, когда пользователь выходит из системы, система завершает процесс после того, как Qt закрывает все окна верхнего уровня. Следовательно, нет гарантии, что у приложения будет время выйти из цикла обработки событий и выполнить код в конце функции main() после вызова QCoreApplication::exec().

Вы используете это неправильно. Не гарантируется, что exec будет прекращено после закрытия окон. Вы должны использовать aboutToQuit сигнал, чтобы остановить другие темы. Если этот сигнал также не излучается, вам нужно позвонить QApplication::quit() явно, когда ваше окно закрыто.

Я не совсем уверен в этом случае, если это ошибка в вашем коде или нет, но в любом случае не рекомендуется создавать QObjectв стеке.

Причина в том, что родительский объект (если есть) будет автоматически вызывать delete когда уничтожено, но тогда объект также будет автоматически уничтожен, когда он выходит из области видимости. Следовательно, объект уничтожается дважды, что является неопределенным поведением. Это может объяснить, почему это работает хорошо в одном случае, а не в другом, поскольку вы не можете полагаться на какое-либо последовательное поведение.

(Но в вашем случае странно, что вы говорите, что деструктор вообще не вызывается...)

Другие вопросы по тегам