2013-07-09 8 views
3

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

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

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

+1

Данное предупреждение больше похоже на две разные версии одной и той же установленной библиотеки –

+0

Пожалуйста, покажите, как вы создаете объекты. Сообщение об ошибке, похоже, не связано с проблемой. –

+0

@ Riateche Они были созданы в основной функции в стеке (не динамически распределены). – sj755

ответ

3

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

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

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

+0

'exec' действительно возвращается. Объекты QObject, которые не удаляются, заставляют процесс не выйти, потому что эти QObjects используются для запуска отдельных потоков, которые не убиваются до тех пор, пока не будет вызван destuctor. – sj755

+0

Просто протестировал мое приложение на другой машине. Кажется, что я не реализовал хороший деструктор на одном из моих QObjects. Он зависает, ожидая, пока нить не вернется. – sj755

1

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

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

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