Speicher wieder freigeben...



  • Hallo,

    Ich habe mal folgende Frage an Euch:

    // Datenpuffer dynamisch erzeugen
    m_pBuf = new char[m_lSize];
    

    Dabei ist "m_pBuf" folgendermassen im Header-File definiert:

    private:
      char* m_pBuf;
    

    Nun möchte Ich natürlich diesen reservierten Speicher wieder freigeben, Ich habe das so gemacht:

    // Speicher wieder freigeben
    if (m_pBuf != NULL)
      delete [] m_pBuf;
    

    Ist das so richtig, d.h. wird hier der komplette Speicher wieder freigegeben (Ich habe in meinem Programm keinen Destruktor definiert...)?

    Danke schon mal
    -Jackler



  • Hi

    Wo rufst du diese Zeilen dann auf ?

    Du gibts den Speicher richtig frei !

    Es ist aber besser das im Destructor zu machen.



  • Zunächst mal vielen Dank für deine schnelle Hilfe, prolog...

    Es handelt sich hier um eine dialogbasierte Anwendung...- bei Beenden des Programms (mittels des Buttons Exit) wird der Puffer gelöscht und damit der Speicher wieder freigegeben.

    Gibt es eigentlich unter Visual Studio ein Tool, mit dem man überprüfen kann, ob auch sämtliche System-Resourcen (nach Beendigung des Programms), wie allokierter Speicher etc. wieder freigegeben werden?



  • moin,
    ich kenn mich mit der speicherfreigabe von c++ nicht so gut aus, weiss aber das die auch teilweise fehler hat. aber wird beim beenden des programms nicht auf jeden fall der speicher automatisch wieder frei gegeben, ohne das man eingreifen müsste?



  • HI

    @emperor

    Nein, für speicher den du dynamisch auf dem Heap alloziert hast, bist du verantworlich ihn wieder frei zugeben. Wenn das programm beendet ist, werden zwar die Bereiche wieder überschrieben, von evtl. anderen Anwendungen, trotzdem sollte man darauf achten dass man keine Memleaks hat...
    Die sind erstma vergeudeter speicher und können in ungünstigen Umständen zu undefiniertem Verhalten führen.



  • Wenn du dein Programm mit dem VisualStudio debuggst und dann das Programm beendest und es Memoryleaks gab, dann steht das in den Debuggerausgaben: "Detected Memoryleaks!" und dann , wo sie entdeckt wurden und was dort steht.
    Deine Abfrage mit

    if(m_pBuf != NULL)
    

    is zwar nciht dumm, bei dir aber auch nicht sinnvoll, da du m_pBuf nirgendwo mit NULL initialisierst.



  • und außerdem ist delete auf einen NULL Zeiger harmlos. also ist die abfrage einfach nur sinnlos



  • Hey danke leute, sollte ich in zukunft mal drauf achten 🙂



  • Meine Abfrage,

    if(m_pBuf != NULL)
    

    ob der Pointer "m_pBuf" auf NULL zeigt ist insofern nicht sinnlos, da der Zeiger im Konstruktor meiner Dialogklasse zuerst mal auf NULL gesetzt wird.
    Nur wenn der Benutzer einen Button namens "Connect" drückt, wird auch der Puffer dynamisch (Heap) allokiert...- beendet der Benutzer hingegen das Programm nach Aufruf sofort wieder (d.h. es wurde ja noch gar kein Speicher für den Puffer angelegt), kann Ich natürlich keinen Speicher freigeben, der nicht vorher von mir allokiert wurde (--> daher die Abfrage nach NULL).

    Trotzdem danke für die vielen Beiträge.

    MfG
    -Jackler


Anmelden zum Antworten