Fenster korrekt zerstören



  • Folgener beispielhafter Code:

    CFrameWnd wnd;
    wnd.Create(0,_T("Test"));
    wnd.ShowWindow(SW_SHOW);
    Sleep(5000);
    wnd.CloseWindow();
    wnd.DestroyWindow();
    

    Wenn ich das mache, fliegt mir DestroyWindow um die Ohren. CloseWindow alleine minimiert aber nur das Fenster, ich will beim Beenden aber ja das Fenster samt Ressourcen freigeben. Wie macht man das korrekt?


  • Mod

    Lass CloseWindow einfach weg und ruf nur DestroyWindow auf.
    Was geschieht den exakt für ein ASSERT, bzw. Crash?



  • Martin Richter schrieb:

    Lass CloseWindow einfach weg und ruf nur DestroyWindow auf.

    Der Fehler fliegt trotzdem

    Martin Richter schrieb:

    Was geschieht den exakt für ein ASSERT, bzw. Crash?

    Folgende Meldung erscheint:

    Windows hat einen Haltepunkt in AERayTrace.exe ausgelöst.

    Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in AERayTrace.exe oder in einer der geladenen DLLs hin.

    Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.

    Wie gesagt der obere Quellcode da ist nru beispielhaft und löst halt den auch den Fehler aus, den mein eigentliches Fenster auch hat.


  • Mod

    Nun dann ist Dein Heap kaputt. Das hat nur am Rande mit dem zerstören des Fenster kaputt.
    Bei mal vorher und zwischen den Calls einen ASSERT(AfxChekMemory()) ein.



  • Macht die Klasse vielleicht ein "delete this;" im PostNcDestroy?


  • Mod

    @hustbaear: Das war der entscheidende Hinweis! Ich war etwas blind. 👍

    CFrameWnd macht immer ein delete this; im OnNcDestroy/PostNcDestroy!
    Und hier wurde auch nicht abgeleitet.

    Ein FrameWnd muss also auf dem Heap leben. Der Code den ich sehe zeigt, dass dieses Objekt auf dem Stack angelegt wurde.
    Also den Code wie folgt ändern:

    CFrameWnd *pwnd = new CFrameWnd();
    pwnd->Create(0,_T("Test"));
    pwnd->ShowWindow(SW_SHOW);
    Sleep(5000);
    pwnd->CloseWindow();
    pwnd->DestroyWindow();
    // delete pwnd; ist nicht nötig, dass macht das CFrameWnd selbst
    


  • Klasse, Vielen Dank für die Hilfe! 🙂



  • Martin Richter schrieb:

    @hustbaear: Das war der entscheidende Hinweis! Ich war etwas blind. 👍

    Passiert den Besten 🙂


Anmelden zum Antworten