Exceptions und Klassen mit dyn. Speicherreservierung



  • Hallo!

    Angenommen ich habe eine Klasse, die dyn. Speicher reserviert:

    class Foo
    {
    private:
        int * m_ptr;
    public:
        Foo()
          : m_ptr(0)
        {
            this->m_ptr = new int[10];
        }
    
        ~Foo()
        {
            if (this->m_ptr != 0)
            {
                delete [] this->m_ptr;
                this->m_ptr = 0;
            }
        }
    };
    

    Wie ist das jetzt wenn ich eine Instanz dieser Klasse erzeuge und dann eine Ausnahme werfe? Wird der Destruktor von Foo aufgerufen und der Speicher freigegeben oder erhalte ich ein memory leak?

    void Test()
    {
        Foo f;
        // etwas Code
        throw std::exception();
    }
    


  • Ja, Variablen mit automatischer Speicherklasse ( auto , oft wird auch der Begriff "Stack" verwendet) werden zerstört, sobald du den Gültigkeitsbereich verlässt, also bei der schliessenden geschweiften Klammer - egal, ob durch throw oder return .

    Das Nullsetzen des Zeigers ist bei dir übrigens sowohl im Konstruktor als auch Destruktor unnötig. Die Prüfung auf Null auch, delete und delete[] dürfen auf Nullzeiger angewandt werden, in diesem Fall passiert halt nichts.



  • Nexus schrieb:

    Ja, Variablen mit automatischer Speicherklasse

    Wäre diese Klasse Foo also auch eine Klasse "mit automatischem Speicher"?

    Nexus schrieb:

    Das Nullsetzen des Zeigers ist bei dir übrigens sowohl im Konstruktor als auch Destruktor unnötig. Die Prüfung auf Null auch, delete und delete[] dürfen auf Nullzeiger angewandt werden, in diesem Fall passiert halt nichts.

    Das stammt noch aus alten VC6 Zeiten. Dort gab es ab und Probleme, wenn ich einen Zeiger auf 0 nicht NULL gestetet habe (obwohl NULL als 0 definiert ist). Ist das verahlten von delete auf Nullzeiger nicht undefiniert, oder irre ich mich hier?



  • Klaas123 schrieb:

    Wäre diese Klasse Foo also auch eine Klasse "mit automatischem Speicher"?

    Die Klasse selbst nicht, aber die lokale Variable f in deinem Beispiel.

    Klaas123 schrieb:

    Das stammt noch aus alten VC6 Zeiten. Dort gab es ab und Probleme, wenn ich einen Zeiger auf 0 nicht NULL gestetet habe (obwohl NULL als 0 definiert ist).

    Arbeitest du denn immer noch mit VC6? Falls ja, steige so schnell wie möglich um. Falls nein, gewöhn dir solche Dinge ab... 😉

    Klaas123 schrieb:

    Ist das verahlten von delete auf Nullzeiger nicht undefiniert, oder irre ich mich hier?

    Ja, du irrst dich, delete und delete[] haben keine Probleme mit Nullzeigern.



  • Nexus schrieb:

    Arbeitest du denn immer noch mit VC6? Falls ja, steige so schnell wie möglich um. Falls nein, gewöhn dir solche Dinge ab... 😉

    Nein, damit arbeite ich zum Glück nicht mehr. Ich werde mich dann wohl bemühen, es mir abzugewöhnen.

    Besten Dank auch.


Anmelden zum Antworten