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 ohne

    e->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


  • Mod

    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.


Anmelden zum Antworten