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
когда уничтожено, но тогда объект также будет автоматически уничтожен, когда он выходит из области видимости. Следовательно, объект уничтожается дважды, что является неопределенным поведением. Это может объяснить, почему это работает хорошо в одном случае, а не в другом, поскольку вы не можете полагаться на какое-либо последовательное поведение.
(Но в вашем случае странно, что вы говорите, что деструктор вообще не вызывается...)