PostQuitMesssage() - memory leaks
-
Hi
Ich möchte mein MFC Programm an einer Stelle radikal mit PostQuitMessage() beenden. Leider werde ich dann vom Compiler informiert, dass es memory leaks gibt.
Ich vermute es liegt daran, dass das Programm nicht mehr alle Destruktoren aller Klassen aufrufen kann bevor es aus dem Speicher entfernt wird.
Nun ist mein Programm in einer Classe enthalten, die ich mit der member funktion Run() starten kann. In der MFC Classe "theApp" kann ich ohneweiters in der Funktion "InitInstance()" eine solche Klasse deklarieren.
Nun wollte ich, dass die Classe die mein eigentliches Programm enthält eine Member Variable von "theApp" ist. Der Sinn des ganzen ist, dass ich dann über die globale Variable "theApp" alle Destruktoren aufrufen kann bevor ich PostQuitMessage() starte. Leider bekomme ich dann folgenden Error:
"missing storage class oder type-specifier"
Also als wie wenn meine Classe an der Stelle unbekannt währe. Die entsprechende Headerdatei ist eingebunden.
Kann man mein Problem auf diese Art überhaupt lösen ( also, dass keine Memory Leaks entstehen ), und warum bekomme ich diesen Error?
Danke
-
Radikal wäre exit() zu benutzen. Bei PostQuitMessage wird eigentlich alles ordnungsgemäß zerstört.
-
Das ist Quark. PostQuitMessage beendet die Nachrichten schleife. Anschließend sind natürlich noch alle Fenster allokiert und sind Leaks!
Icfh weiß nicht wer diesen Quatsch mit PostQuitMessage mal in die Welt gesetzt hat ein Programm zu beenden! Es beendet brutal die Nachrichtenschleife ohne darauf Rücksicht zu nehmen, dass da noch offene Fenster sind.
Korrekt wäre das zerstören des Main Windows per DestroyWindow, das löst dann auch den PostQuitMessage aus.
Wenn jedoch radikal beendet werden soll/muss warum kümmert man sich dann noch um Leaks, den es ist in diesem Fall ja meistens ein Notfall!
-
Also kurz gesagt wenn das Programm abgewürgt wird mit "exit(0)" dann sind leaks ziemlich egal. Windows wird dadurch also nicht im geringsten beeinträchtigt ( MFC ist statisch gelingt, wenn das einen einfluss darauf nimmt ). Hab mal gelesen Programme können auch leaks in DLLs erzeugen, die nach Programm ende noch bleiben.
-
Martin Richter: Aber nachdem die Nachrichtenschleife abgebrochen wurde wird doch WinMain beendet und alle globalen Objekte werden ordnungsgemäß zerstört, sprich die Destruktoren werden aufgerufen. Außer sie werden auf dem Heap angelegt.
-
mfcanfänger: exit() bitte niemals in einem C++ Programm benutzen! Ausser dir ist alles scheiss egal, aber dann hättest du bestimmt nicht den Thread eröffnet.
-
Das ist eben das Problem. Alle von CFRameWnd abgeleiteten Klassen werden auf dem Heap angelegt, inkl. aller Views und CDocuments. D.h. heißt im Klartext, keiner dieser vielen Destruktoren wird aufgerufen. Je nachdem was nun für Objekte allokiert wurden oder Handles angefordert wurden können durchaus Leaks aller Form bleiben. Und ja XP/NT ist sehr robust dagegen, aber eben nicht grundsätzlich gefeit.
Also im Notfall ja, als Normalfall eben nein!