dtor bei Exception



  • Habe ich das richtig beobachtet, dass wenn eine Exception in einer Methode geworfen wird, erst den dtor des Objektes aufgerufen wird, bevor das Objekt dann verlassen wird?

    Wenn ich allerdings eine Exception im ctor eines Objektes auslöse, dann wird dieses ohne einen dtor-Aufruf verlassen? Echt blöd.

    Ganz schlimm ist es, eine Exception im dtor zu werfen, da gibt es dann keine Chance einen eventuellen Aufräumcode noch ausführen zu lassen, was macht man da?



  • Der Destruktor wird erst aufgerufen, wenn das Objekt out-of-scope geht. Egal ob durch Exception oder Funktionsrückgabe.

    Im Konstruktor ist die Objektkonstruktion noch nicht abgeschlossen, daher macht ein Destruktoraufruf keinen Sinn. Was ist daran blöd?

    In Destruktoren sollten keine Exceptions geworfen werden.



  • Nexus schrieb:

    Im Konstruktor ist die Objektkonstruktion noch nicht abgeschlossen, daher macht ein Destruktoraufruf keinen Sinn. Was ist daran blöd?

    Ok, ja was ist wenn man im ctor drei mal Speicher reserviert und beim letzten Reservieren wird einen std::bad_alloc ausgelöst, dann werden die beiden ersten nie freigegeben?

    Ich habe das dann beim dem Test mit unique_ptr gemacht und das war dann natürlich kein Problem mehr, aber ohne? Tja, echt blöd 🙂



  • Grasshopper schrieb:

    Nexus schrieb:

    Im Konstruktor ist die Objektkonstruktion noch nicht abgeschlossen, daher macht ein Destruktoraufruf keinen Sinn. Was ist daran blöd?

    Ok, ja was ist wenn man im ctor drei mal Speicher reserviert und beim letzten Reservieren wird einen std::bad_alloc ausgelöst, dann werden die beiden ersten nie freigegeben?

    Ja.
    Deshalb tut man dafuer RAII verwenden.

    Woher soll der DTor denn wissen wieviel Prozent des Objektes schon konstruiert waren?



  • Grasshopper schrieb:

    Ok, ja was ist wenn man im ctor drei mal Speicher reserviert und beim letzten Reservieren wird einen std::bad_alloc ausgelöst, dann werden die beiden ersten nie freigegeben?

    Doch, wenn du es richtig machst. Verwende RAII, dann hast du nie solche Probleme.

    class MyClass
    {
    public:
        MyClass() : p(new P), q(new Q), r(new R)
        {
        }
    
    private:
        std::unique_ptr<P> p;
        std::unique_ptr<Q> q;
        std::unique_ptr<R> r;
    };
    

    Übrigens brauchst du so auch gar keinen Destruktor zu definieren.



  • Ja ist schon richtig, muss man nur drauf achten und dann sowas wie unique_ptr nutzen.

    EDIT: man wird hier schnell gepostet^^



  • Grasshopper schrieb:

    Ja ist schon richtig, muss man nur drauf achten und dann sowas wie unique_ptr nutzen.

    Der Gag an unique_ptr ist ja eben, dass man dann nicht mehr darauf achten muss. 🤡



  • Grasshopper schrieb:

    EDIT: man wird hier schnell gepostet^^

    Ich bin hier noch nie gepostet worden 🤡



  • LOL, na das war doch mal schön verschrieben 😃 ymmd^^


Log in to reply