Den Speicher korrekt aufräumen



  • So mal wieder etwas 🙂

    Alle Objekte die ich mit new anlege werden nach dem beenden des Programm nicht wieder freigegeben bzw. ihr speicher wird nicht freigegeben.
    Alles andere schon oder? Also muss ich mich nur um die Objekte kümmern die ich mit new angelegt habe!?

    Ok,
    nun habe ich in meinem Programm viele verschiedene Klassen, die wiederum verschiedenen Objekten enthalten.
    Angenommen ich habe in meinem Programm eine Klasse myClass.
    In dieser befinden sich Objekte von der Klasse mySubClass.

    myClass habe ich ohne new erzeugt, da dieses Objekt in meinem kompletten Code gültig ist.
    Die Objekte mySubClass die sich IN myClass befinden wurden mit new erzeugt.

    Muss nun in dem Destruktor von myClass alle Objekte von mySubClass entfernt werden? Oder wie mache ich das genau?



  • redbomber schrieb:

    Alle Objekte die ich mit new anlege werden nach dem beenden des Programm nicht wieder freigegeben bzw. ihr speicher wird nicht freigegeben.
    Alles andere schon oder? Also muss ich mich nur um die Objekte kümmern die ich mit new angelegt habe!?

    Mit new angelegte Variablen können bei Programmende automatisch freigegeben werden, es besteht jedoch keine Garantie. Besser, man verlässt sich nicht darauf.

    redbomber schrieb:

    Muss nun in dem Destruktor von myClass alle Objekte von mySubClass entfernt werden? Oder wie mache ich das genau?

    Ja, was du angefordert hast, musst du auch wieder freigeben.

    Wenn du im Konstruktor Speicherbereiche mit new anforderst (z.B. über die Initialisierungsliste):

    myClass::myClass()
    : Var1(new mySubClass)
    , Var2(new mySubClass[3])
    {
    
    }
    

    dann musst du diesen Speicher im Destruktor auch wieder freigeben.

    myClass::~myClass()
    {
        delete Var1;
        delete[] Var2;
    }
    

    Ausserdem solltest du immer gleich die Grossen Drei überladen, also zusätzlich noch Kopierkonstruktor und Zuweisungsoperator.



  • Tatsächlich, ich habe gerade aus Interesse den ISO-Draft und ein Buch durchforstet und nichts gefunden. Allerdings dürfte bei den aktuellen Betriebssystemen das Speichermanagement des Kernels sich den Speicher wiederholen, den ein Prozess wärend der Laufzeit zugewiesen bekommen hat.

    Aber gut, wenn man unter DOS oder so programmiert könnte das ja sogar relevant sein.

    Wenn jemand was genaueres weiß: Würde mich auch interessieren.


Log in to reply