2013-07-09 1 views
3

J'ai deux classes enfants QObject dans mon application Qt. Un objet de chacune de ces classes a été instancié sur la pile. Auparavant, mon application se terminait proprement. Cependant, depuis que j'ai mis à jour à Qt5.1.0, leurs destructeurs ne sont pas appelés. Je reçois l'avertissement suivant deux fois lorsque je lance le débogueur.QLes destructeurs d'objet ne sont pas appelés

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

Est-ce un bug dans Qt ou dans mon code?

+1

L'avertissement donné ressemble plus à deux versions différentes de la même bibliothèque installée –

+0

Veuillez montrer comment créer des objets. Le message d'erreur semble être sans rapport avec le problème. –

+0

@Riateche Ils ont été créés dans la fonction principale de la pile (non alloués dynamiquement). – sj755

Répondre

3

Voir la documentation de QCoreApplication::exec:

Nous vous recommandons de vous connecter propre -up code au signal aboutToQuit(), au lieu de le placer dans la fonction main() de votre application car sur certaines plates-formes, l'appel QCoreApplication :: exec() peut ne pas retourner. Par exemple, sous Windows, lorsque l'utilisateur se déconnecte, le système termine le processus après que Qt ferme toutes les fenêtres de niveau supérieur. Par conséquent, il n'y a aucune garantie que l'application aura le temps de quitter sa boucle d'événements et d'exécuter du code à la fin de la fonction main() après l'appel QCoreApplication :: exec().

Vous ne l'utilisez pas correctement. Il n'est pas garanti que exec sera fermé après la fermeture des fenêtres. Vous devez utiliser le signal aboutToQuit pour arrêter les autres threads. Si ce signal n'est pas émis non plus, vous devez appeler explicitement QApplication::quit() lorsque votre fenêtre est fermée.

+0

'exec' renvoie cependant. Les QObjects qui ne sont pas supprimés provoquent l'arrêt du processus car ces QObjects sont utilisés pour lancer des threads séparés, qui ne sont pas supprimés tant que le Destuctor n'est pas appelé. – sj755

+0

Juste testé mon application sur une machine différente. Il semble que je n'ai pas implémenté un bon destructeur sur l'un de mes QObjects. Il serait en attente d'un fil pour rejoindre. – sj755

1

Je ne suis pas exactement sûr dans ce cas si c'est un bug dans votre code ou non, mais de toute façon il est pas recommandé pour créer QObject s dans la pile.

La raison en est que l'objet parent (le cas échéant) appellera automatiquement delete lorsqu'il est détruit, mais l'objet sera également automatiquement détruit lorsqu'il sort de la portée. Par conséquent, l'objet est détruit deux fois, ce qui correspond à Comportement indéfini. Cela peut expliquer pourquoi cela a bien fonctionné dans un cas, et pas dans un autre, puisque vous ne pouvez pas compter sur un comportement cohérent.

(Mais dans votre cas, il est étrange que vous dites est le destructor pas appelé du tout ...)

Questions connexes