2017-02-18 1 views
0

J'ai un programme MFC C++ qui se bloque occasionnellement sur une sortie d'erreur sans raison apparente. Ma requête spécifique est la suivante:Sortie de programme en désordre: MFC C++

Dans ma surcharge d'InitInstance(), il existe diverses vérifications, ainsi que la mise en place de ressources telles que les événements et les sémaphores. Quand une sortie normale est demandée par l'utilisateur, il y a un gestionnaire de message OnDestroy() qui ferme tout, y compris libérer des ressources, etc. Ce bit fonctionne bien.

Le problème se produit lorsque l'une des vérifications dans InitInstance() échoue et la fonction renvoie la valeur 0 (provoquant une sortie de programme). Ma question est la suivante: Dans ce cas, OnDestroy() est-il automatiquement appelé pour nettoyer les choses, ou ai-je besoin de l'exécuter moi-même avant de quitter InitInstance?

+0

Pourquoi ne pas demander à votre débogueur à la place? Définissez un point d'arrêt dans 'OnDestroy()' et voyez ce qui se passe. De plus, un processus ne plante pas * "sans raison apparente" *. La raison devient évidente, lorsque vous définissez votre débogueur à rompre, lorsqu'une exception Win32 est déclenchée. Ne sois pas impuissant. – IInspectable

+0

Tout thread ou mutex dans votre programme qui survit au programme principal? Ils sont censés être fermés après les sorties principales, mais il y a un bogue de MSVC qui doit être corrigé manuellement. – ark1974

+1

@ ark1974: Lorsque le contrôle quitte le point d'entrée fourni par l'utilisateur (il s'appelle 'WinMain' dans un programme graphique, pas' main'), la plupart du temps, le nettoyage est effectué ou non. Le processus est sur le point de se terminer et l'OS récupèrera toutes les ressources de toute façon. Vous ne savez pas quel "bug" * vous parlez. – IInspectable

Répondre

0

Si une fenêtre principale existe déjà, vous devez la détruire avant, en utilisant DestroyWindow. Et non, il n'est pas automatiquement détruit quand InitInstance est quitté avec FALSE. ExitInstance est exécuté, mais les fenêtres existantes seront fermées lorsque l'application se termine.

De toute façon, les ressources normales comme les fichiers et la mémoire sont libérées lorsque l'application existe.