Exceptions löschen
-
Hallo,
Habe eine kurze Frage:
Habe meine Exceptionklasse von CException abgeleitet
class CSiException : public CException { DECLARE_DYNAMIC( CSiException ) public: CSiException (); CSiException ( CString &sErrorText ); virtual ~CSiException (); CString GetErrorMsg (); private: CString m_sErrorText; };Dann mache ich einen throw:
CString sError; sError.Format( _T("ERROR bla bla") ); CSiException * except = new CSiException( sError ); throw except;Hier der catch block:
catch( CSiException * e ){ CString sError; sError.Format(_T("Following Exception occured: %s"), e->GetErrorMsg()); AfxMessageBox( sError ); e->Delete(); }Nun, meine Frage ist bzgl. des
e->Delete();Muss ich das machen oder nicht? Mir ist nicht ganz klar ob der Destruktor von der Exception automatisch aufgerufen wird? Kann mir das mal einer erklären?
Also mit oder ohnee->Delete();?
Danke
-
Hallo,
CString sError;
sError.Format( _T("ERROR bla bla") );
CSiException * except = new CSiException( sError );
throw except;hier wirfst Du ein CSiException Objekt welches im H-Speicher einen Platz einnimmt. Um diesen wieder freizugeben musst Du die Delete-Anweisung ausführen, sonst belegst Du nur unnötigen Speicher. Wenn Du keine eigene Exception wirfst und zur Laufzeit entsteht ein Ausnamefehler welcher MFC-speziefisch ist, dann wird intern mit throw new C... eine Ausnahme geworfen, welche wieder hervorruft das sie im HS mit Delete gelöscht werden muss.
LG
-
Nur zur Info: MFC Exceptions werden als Zeiger geworfen. Dies liegt in den historischen Urzeiten der C++ Sprache begründet als throw/catch noch nicht im Standard war. Deshlab würde grundsätzlich immer nur ein Zeiger geworfen. Die entsprechenden Objekte müssen auch entsorgt werden, deshalb wird bei MFC Exceptions immer en e->Delete ausgeführt.
Früher hta man das mit den MFC Makros TRY, CATCH, CATCH_ALL, die keiner mehr verwendet, geregelt.