memory leak



  • Hallo,

    void main (void)
    {
    
    int* ptr=new int[100000000]
    
    delete[] ptr;  //Schlimm wenn ich das vergesse ?
    }
    

    Was passiert wenn ich vergesse den Speicher wieder freizugeben nachdem
    sich das Konsolenfester geschlossen hat ? Steht der Speicher dem BS wieder
    zur Verfügung? Oder muss ich den Computer neustarten ?

    Bye



  • Das OS gibt den Speicher wieder frei, sobald der Prozess beendet wird.
    Zumindest unter Windows.

    Simon

    Edit
    BTW: void als Rückgabe Wert von main ist nicht zulässig.



  • blurry33 schrieb:

    Steht der Speicher dem BS wieder zur Verfügung?

    Ja. Gelegentlich nutze ich das sogar aus und lasse ich sogar absichtlich globale Zeiger auf Arrays hängen. Aber nur ganz selten, weil ich damit Code baue, der bei anderen Leuten unter Umständen viele Warnungen verursacht.



  • volkard schrieb:

    blurry33 schrieb:

    Steht der Speicher dem BS wieder zur Verfügung?

    Ja. Gelegentlich nutze ich das sogar aus und lasse ich sogar absichtlich globale Zeiger auf Arrays hängen. Aber nur ganz selten, weil ich damit Code baue, der bei anderen Leuten unter Umständen viele Warnungen verursacht.

    wieso tust du das? nur aus faulheit oder gibts da noch nen praktischen grund für?

    bb



  • unskilled schrieb:

    wieso tust du das? nur aus faulheit oder gibts da noch nen praktischen grund für?

    20 oder 30 Bytes Code in der exe einsparen als Vorwand für die Faulheit.
    Mist, das Beispiel, das ich im Kopf hatte, hat sich von alleine geheilt; als ich die Berechnung der Tabelle mit einem Meyers-Singleton verzögert hatte, ist auch der Zeiger durch eine Array-Klasse ersetzt worden.



  • blurry33 schrieb:

    Steht der Speicher dem BS wieder
    zur Verfügung? Oder muss ich den Computer neustarten ?

    Mit grosser Wahrscheinlichkeit wird der Speicher vom Betriebssystem freigegeben.

    Allerdings würde ich mir sowas nicht angewöhnen. Besser, man zieht die Speicherverwaltung gleich richtig durch. Sonst beginnt man plötzlich zu denken "ah, das ist am Ende des Programms, da brauch ich nicht freizugeben". Erstens muss man sich so zusätzlich Fälle und Ausnahmen überlegen, zweitens riskiert man, dass bei einer Codeänderung plötzlich ein Memory Leak entsteht, weil das Programm doch noch nicht beendet wird und man vergessen hat, die Ausnahme zu reparieren. Ausserdem ist sowas lästig, wenn man Speichertools fürs Debuggen einsetzt.

    So schlimm ist das delete bzw. delete[] nun wirklich nicht, besonders wenn man seine Speicherverwaltung mehr und mehr kapselt und auf RAII setzt.


Log in to reply