Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Destroywindow

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.05.2003, 15:15 Uhr
Astardes



Ich starte mein Programm im Debugmodus. Nach einer gewissen Zeit bricht das Programm einfach ohne Vorwarnung ab. Im Debugfenster hab ich folgende Meldung, die vermutlich ausschlaggebend ist:

Thread 0xE8 wurde mit Code 0 (0x0) beendet.
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.
Detected memory leaks!

Woran könnte das liegen ?
--
MfG
Astardes
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.05.2003, 16:24 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich bin kein MFC Spezi, aber eines ist sicher bei so einer Konstruktion:

C++:
class CDialog: public Sonstwas
{
    virtual onBla();
};

class Derived: public CDialog
{
    virtual onBla();
};


Kann vom Destructor von CDialog nicht mehr auf die Spezialisierten Eigenschaften einer abgeleiteten Klasse zugegriffen werden. C++ wird die virtuellen methoden, die von Derived überschrieben wurden, in der Destructorphase wieder zurücksetzen, weil der Anteil, den die Klasse Derived am Objekt hat, bereits vom Destructor von Derived gelöscht wurde.

Tja, und wenn Da ein DestroyWindow gemacht wird und daher ein MEssageCallback aufgerufen wird, dann erklärt das die eine Meldung.
Das mit dem Memoryleaks kann ich so nicht beurteilen, aber kann es sein, daß Du einer der og. Methoden überschrieben hast und dort Speicher freigeben wolltest?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.05.2003, 11:01 Uhr
~Ente_Knusprig
Gast


Nein das verhält sich ein wenig anders:

Das normale procedere zum Zerstören eines Fensters ist das Schicken eines WM_DESTROY an das Fenster, was schlußendlich an DestroyWindow delegiert wird.

Wenn Du allerdings ein Fenster mittels Aufruf des Destruktors beendest passiert das nicht (das Fenster würde dann ja eine Message an sich selber schicken, was wohl nicht unbedingt notwendig ist).
Das führt dann zu dieser Warnung.

In der Regel kann man die Warnung ignorieren (da würden mir Deine Memory Leaks mehr Kopfschmerz bereiten... :-) )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.05.2003, 13:00 Uhr
virtual
Sexiest Bit alive
(Operator)


Hallo knusprige Ente
Bist du Dir sicher? - Das ist der entscheidende Source von CDialog:

C++:
CDialog::~CDialog()
{
    if (m_hWnd != NULL)
    {
        TRACE0("Warning: calling DestroyWindow in CDialog::~CDialog --\n");
        TRACE0("\tOnDestroy or PostNcDestroy in derived class will not be called.\n");
        DestroyWindow();
    }
}



DestroyWindow ist ein member von der Klasse. Die Warnung Besagt nun folgendes: Wenn ich eine abgeleitete Klasse habe, wo ich DestroyWindow überschrieben habe, dann kann im Destructor nur noch CDialog:estroyWindow aufgerufen werden, nicht jedoch die Version der abgeleiteten Klasse. Wenn nun DestroyWindow in der Abgeleiteten Klasse deshalb überschrieben wurde, um dort Resourcen freizugeben, dann ist es schon eine wichtige Frage, ob diese Resourcen freigegeben werden oder nicht.

Als Lösung bieten sich zwei verfahren an: Man Schreibt in der abgeleiteten Klasse einen eigenen Destructor, der auch nur DestroyWindow aufruft. Damit ist dann sichergestellt, daß die überschriebene Version genommen wird. Oder - und das ist empfehlenswert - man achtet darauf, daß das Fenster bereits destroyed worden ist, bevor das Objekt destruiert wird
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 23.05.2003 um 13:04 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.05.2003, 13:32 Uhr
Ente_Knusprig



Hi virtual,

es geht doch hier prinzipiell darum mitzuteilen, daß der normale Weg über das Message-Dispatching zum Schliessen des Fensters durch Aufruf des Destruktor bei noch gültigem Fenster umgangen wurde.
Das CWnd:estroyWindow muss aber in beiden Fällen zwingend aufgerufen werden.

Wenn DestroyWindow dafür verwendet wird um nicht direkt an das Fenster gebundene Ressourcen freizugeben dann ist das ganz klar der falsche Platz und ein schlechter Stil.

Alle Resourcen die nichts mit dem Fenster sollten doch ausnahmslos im Destruktor freigegeben werden. Resourcen werden ja auch in InitDialog initialisiert und nicht im Create, oder?

P.S.: Ausserdem heisst die Methode ja DestroyWindow und nicht DestroyWindowAndSomeOtherStuff........ :-)

Gruß

Die knusprige Ente
--
Knusprig sein, das ist fein
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: