Frage zu Speicherpool aus "Effektiv C++"



  • So an alle die auch das Buch haben, ich hätte da mal eine Frage zu Lektion 10(3. dt. Auflage).

    Meyers überschreibt ja hier den new und delete operator. Mir gehts um das delete. Ich hab ja soweit verstanden, warum er den Speicher nicht freigibt, sonder zur evtl. Wiederverwendung wieder in den Speicherpool überführt.
    Aber muss nicht zumindest beim Beenden des Programmes irgendwie die Speicherblöcke, welche mit ::new angelegt wurden(falls der headOfFreeList 0 ist), wieder mit dem ::delete freigegeben werden? Wo ist mein Denkfehler?

    MfG Pellaeon



  • Afaik kümmert sich das Betriebssytem darum, daß nach Programmende aller angeforderter Speicher wieder freigegeben wird.



  • Werden auch klassische Mem-Leaks nach Programmende vom BS freigegeben?



  • Wenn das Programm beendet ist, ist es eh zu spät. Das OS hat ja für deinen Prozess Speicher reserviert, der wird bei Beenden _rücksichtslos_ wieder vom OS zurück gefordert - sprich freigegeben. 😉

    Aber, (ja, aber!) in ganz bestimmten Patterns ist es wichtig auch bei Beenden des Programms die Objekte sauber zu löschen. Denn es könnte ja sein, das einige Objekte in ihrem Dtor noch Daten persistieren müssen. Z.B. sich selbst in eine Datenbank schreiben oder so. Aber ansonst ist es nicht so tragisch.



  • Artchi schrieb:

    Aber, (ja, aber!) in ganz bestimmten Patterns ist es wichtig auch bei Beenden des Programms die Objekte sauber zu löschen. Denn es könnte ja sein, das einige Objekte in ihrem Dtor noch Daten persistieren müssen. Z.B. sich selbst in eine Datenbank schreiben oder so. Aber ansonst ist es nicht so tragisch.

    dafür ist der benutzer von operator new oder operatore delete zuständig. sicherlich nicht die globale operator delete. die weiß ja nichtmal die typen der objekte. und nen gc bauen war nicht im sinne des erfinders.



  • Smartpointer.



  • volkard schrieb:

    Artchi schrieb:

    Aber, (ja, aber!) in ganz bestimmten Patterns ist es wichtig auch bei Beenden des Programms die Objekte sauber zu löschen. Denn es könnte ja sein, das einige Objekte in ihrem Dtor noch Daten persistieren müssen. Z.B. sich selbst in eine Datenbank schreiben oder so. Aber ansonst ist es nicht so tragisch.

    dafür ist der benutzer von operator new oder operatore delete zuständig. sicherlich nicht die globale operator delete. die weiß ja nichtmal die typen der objekte. und nen gc bauen war nicht im sinne des erfinders.

    Wie erfolgt denn dann der Aufruf des Destruktors eines Objektes, wenn man delete benutzt? (habe mich mit new und delete bisher nicht nicht genauer auseinander gesetzt, wie die intern funktionieren, daher die Frage 🙂 )



  • wenn du in deinem Code den Ausdruck "delete p;" stehen hast, wird an dieser Stelle erst der Destruktor von *p aufgerufen und danach der ::operator delete(p) angewendet. (bei der Array-Version "delete[] p;" wird vorher noch die Größe des von p referenzierten Arrays ermittelt und die Destruktoren rückwärts in einer Schleife aufgerufen)



  • Artchi schrieb:

    Smartpointer.

    wozu? gehen wir doch erstmal davon aus, daß der, der new macht, auch delete machen wird.


Anmelden zum Antworten