Speicher-Leaks



  • Moin Leute.
    Wenn man Speicher auf dem Heap reserviert und ihn nicht wieder freigibt, entsteht ja ein Speicher-Leak. Gibt der Compiler den Speicher selber wieder frei (am Ende des Programms) oder bleibt das Leak hartnäckig??

    BodPa



  • kommt auf das betriebssystem an.
    der compiler hat da gar nix zu sagen, der kompiliert nur und ist dann für immer vom programm fern.



  • Gibt der Compiler den Speicher selber wieder frei

    Nein. Der Compiler mit Sicherheit nicht. Der Compiler hat mit dem Heap nichts zu tun.

    oder bleibt das Leak hartnäckig??

    Praktisch gesehen hängt das von deinem Betriebssystem ab. Moderne Betriebssysteme machen sämtlichen, von einem Prozess belegten Speicher, bei Prozessende wieder verfügbar.

    Der C++-Standard garantiert sowas aber natürlich nicht. Du kannst dich also auf nichts verlassen. D.h. eine fehlende Freigabe ist auf jeden Fall schlechter Stil, unter Umständen ein Memory-Leak (und schlimmer häufig ein Resource-Leak) und für lang laufende Programme ein echtes Problem.



  • Verdammtes Telefon 🙂



  • Original erstellt von HumeSikkins:
    Verdammtes Telefon 🙂

    warum, gibt das den speicher nicht von selbst frei 😕



  • @japro
    Es hinderte mich daran meinen Beitrag rechtzeitig fertigzustellen und machte ihn damit nutzlos.



  • 2x ist besser als keinmal und du hast auch etwas ausführlicher geschrieben



  • Original erstellt von davie:
    kommt auf das betriebssystem an.
    der compiler hat da gar nix zu sagen, der kompiliert nur und ist dann für immer vom programm fern.

    Warte, einige Compiler entdecken Speicher-Leaks bereits bei der Kompilierung (steht in einem Buch). Ich bin mir aber sicher, dass damit der Debugger gemeint ist ;).



  • void foo () {
       int *x = new int;
    }
    

    wenn der compiler intelligent ist, warnt er mich. das setze ich aber nicht voraus.



  • Das ist für solche akademischen Beispiele vielleicht sinnvoll, ernstzunehmen ist es aber nicht.

    #include <fstream>
    
    void foo() {
        int *p = new int[100];
        std::ofstream out("foo.txt");
        out << p;
    }
    
    void bar() {
        std::ifstream in("foo.txt");
        int *p;
        in >> p;
       delete [] p;
    }
    
    int main () { foo(); bar(); }
    


  • Also ich glaube mal meinem alten Kumpel Jesse Liberty, der da in seinem Buch schrieb, dass der reservierte Speicher am Ende des Programms freigegeben wird.

    Noch ein paar Worte zu guten IDE's: Einige (professionelle) entdecken Speicher-Leaks.



  • Noch ein paar Worte zu guten IDE's: Einige (professionelle) entdecken Speicher-Leaks.

    Aber verlassen sollte man sich darauf nicht 🙂 Fuer VC6 "schaff" ich es, meine Speicherleaks so zu verstecken, das die IDE (Debugger) ned meckert ... Aber das BS an den Rande des Wahnsinns treibt, wenn man ned rechtzeitig damit aufhoert ... und ich also meine Leaks selber suchen und ueberwachen muss ....

    Ciao ...



  • Also ich glaube mal meinem alten Kumpel Jesse Liberty, der da in seinem Buch schrieb, dass der reservierte Speicher am Ende des Programms freigegeben wird.

    Wie gesagt, dass kommt auf das Betriebssystem an. Irgend jemand hat mal erzählt, dass das zB. bei WinNT 4 nicht so ist! Aber selbst wenn der Speicher am Ende des Programmes freigegeben wird, sollte man drauf achten, dass es keine Speicher Lücken gibt. Angenommen, du schreibst einen Server, der in irgend einer Funktion ein kleines Speicherloch hat, nur ein paar bytes. Aber ein Server läuft je nach dem 24 Stunden am Tag und 7 Tage in der Woche und 365 Tage im Jahr und so sammelt sich das an und nach ein paar Tagen (vielleicht Monaten) darf man dann den Server neustarten, also lieber gleich vernünftig programmieren.



  • Also ich glaube mal meinem alten Kumpel Jesse Liberty, der da in seinem Buch schrieb, dass der reservierte Speicher am Ende des Programms freigegeben wird.

    Na das darf nie und nimmer eine begründung sein wieso man Resourcen nicht freigibt. Es gibt ja noch mehr wie Speicher.... Alles was man sich irgendwoher reserviert muss auch sicher wieder irgendwo freigegeben werden.

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=cpp2html dort in den FAQs findest Du ne Informationen wie man sich das erleichtern kann. (Sry seite geht grad nicht und den genauen Link hab ich nicht.)





  • kurze anmerkungen:
    es gibt auch ressourcen die das OS nicht freigeben kann, weil sie eben nicht Prozessgebunden sind.

    was macht man denn dann? dann hilft einem nur beten...

    achja, zu den 'coolen' Typen die denken, dass das OS alles macht: was ist denn, wenn euer Programm mal länger läuft - sagen wir 3 wochen am stück. und nie wird speicher freigegeben... dann habt ihr den Rechner in die Knie gezwengt, denn das OS ist kein GC!!



  • was ist denn, wenn euer Programm mal länger läuft - sagen wir 3 wochen am stück

    Dann muss man regelmäßig forken 😃
    Ich habe von Implementationen gehört, bei denen free etwa so aussieht:

    void free( void *memblock )
    {
        // ach ne. Ich bin heute zu müde zum Aufräumen...
        return;
    }
    

    PS: Wer angeforderte Resourcen nicht freigibt handelt unmoralisch 🙂



  • Nun ja, ich glaube ihr habt mich nicht ganz richtig verstanden.
    Ich selber bin ein relativ sauberer Programmierer und räume am Ende des Programms immer schön meinen Müll wieder weg.

    Es ging mir jetzt nur darum, falls ich das Freigeben mal vergesse. Nobody is perfect.

    Gut, das es keine generelle Antwort gibt habe ich jetzt gemerkt. Also danke an alle.

    BodPa


Anmelden zum Antworten