Programmende = Freigabe des gesamten genutzten Speichers ?



  • Hallo,

    ich bin noch ein ziemlicher C++ anfänger, und habe eine Frage zu KlassenInstanzen die mit new erzeugt wurden. Ist kein Problem an sich (evtl. auch nur noch nicht) sondern rein eine Frage des interesses bzw. sauberer Programmierung.

    Also ich erzeuge eine Instanz mit new. dadurch wird ja dann speicher reserviert. der wird durch den aufruf des destructors normalerweise wieder freigegeben.
    Wenn jetzt aber mein programm beendet wird, wird dann automatisch der gesamte speicher vom Betriebssystem (Windows oder Linux interessiert mich beides) wieder freigegeben und verwendet, auch wenn ich nicht explizit die destructoren aufrufe, oder "mülle" ich mir den speicher voll, wenn ich im programm viel speicher brauche, und es sehr oft hintereinander starte und wieder beende?

    sollte ich speicher explizit wieder freigeben, oder ist nach dem beenden sowieso egal was vorher war.
    die Klassen müssen während der gesamten laufzeit bestehen, das man speicher den man während der laufzeit nicht braucht freigeben sollte, weiß ich auch 🙂

    Vielen Dank für die hoffentlich klärenden worte,
    CGI-BIN



  • Generell gilt :

    Alles was Du an Resourcen anforderst muss auch im Programm wieder freigegeben werden.



  • Die Destruktoren dieser Objekte werden zwar nicht aufgerufen, du kannst aber unter Linux und IMHO auch Windows davon ausgehen, dass jeglicher Speicher, der normal mit new angefordert wurde, automatisch beim Beenden des Programms freigegeben wird.



  • Also ich erzeuge eine Instanz mit new. dadurch wird ja dann speicher reserviert. der wird durch den aufruf des destructors normalerweise wieder freigegeben.

    Wie machst du das genau (Code)?



  • Foo * f = new Foo; ohne späteres delete f; vielleicht? Ich seh da keine Mehrdeutigkeit, tut mir leid.



  • Ja genau so mach ich das!

    Fazit: Sauberer Programmierstil wäre alles explizit freizugeben, tut man's nicht gibt's wohl auch keine Probleme.

    OK



  • Deshalb werden auch insbesondere Server-Anwendungen, die rund um die Uhr laufen sollen als kritisch angesehen, da dort auch 1-Byte-Lecks langfristig Probleme machen können/werden.



  • Es gibt in dem Moment ein Problem, in dem du dich entschließt, dein One-Shot-Programm als Routine in einem größeren System zu verwenden, weil du dann Memoryleaks hast.



  • Problematisch ist es auch, wenn ein Destruktor noch Arbeit zu erledigen hat. Ein Log könnte zum Beispiel beim schließen noch die letzten Meldungen rausschreiben. Wenn der Destruktor aber nicht aufgerufen wird wird das nie geschehen.



  • Hi,

    sagen wir es so: Es ist extrem schlechter Stil, auch in einem Fünfzeilenprogramm, Speicher zu allokieren und darauf zu bauen, dass er eh vom OS beim Beenden des Prozess freigegeben wird.

    ChrisM


Anmelden zum Antworten