Speicher bei vector automatisch freigegeben?



  • TKlasse* Klasse = new TKlasse();
                MeinVector.push_back(Klasse);
    

    Wenn ich das Programm schließe, wird dann auch der Speicher korrekt freigegeben oder muss ich den Vektor vorher durchlaufen und die Elemente selbst deleten?



  • Speicher der dynamisch mit "new" angefordert wurde, muss auch mit "delete" wieder freigegeben werden. Der STL-Vektor übernimmt diese Aufgabe nicht. Warum sollte er das auch tun? Er kennt Deine Klasse nicht.

    // ...Vektor "MeinVector" instanziieren
    Klasse *myKlasse = new Klasse();
    MeinVector.push_back(myKlasse); // Vektor speichert Zeiger auf Klasse
    delete myKlasse;
    


  • Musst du selbst löschen (Vector durchlaufen). Alternativ kannst du dir mal SmartPointer an gucken. Man sollte nicht davon ausgehen, das wenn das Programm beendet ist, das alles korrekt freigegeben wird. Auf new MUSS ein delete folgen.



  • // ...Vektor "MeinVector" instanziieren
    Klasse *myKlasse = new Klasse();
    MeinVector.push_back(myKlasse); // Vektor speichert Zeiger auf Klasse
    delete myKlasse;
    

    [/quote]

    delete myKlasse;

    würde ich nicht machen, was ist wenn du den Vector noch verwenden willst, du ruppst dem Vector somit die Beine weg, sieht für mich leich gefährlich aus.



  • Ok ich habe jetzt im Destruktor meiner Klasse, wo ich diesen Vektor fülle, folgendes stehen:

    for(unsigned int i = 0; i < MeinVektor.size(); i++)
      {
        delete MeinVektor[i];
      }
    

    So sollte es dann funktionieren.



  • jd schrieb:

    // ...Vektor "MeinVector" instanziieren
    Klasse *myKlasse = new Klasse();
    MeinVector.push_back(myKlasse); // Vektor speichert Zeiger auf Klasse
    delete myKlasse;
    

    delete myKlasse;

    würde ich nicht machen, was ist wenn du den Vector noch verwenden willst, du ruppst dem Vector somit die Beine weg, sieht für mich leich gefährlich aus.[/quote]

    Stimmt! Sehe ich auch so. Mir geht darum darauf hinzuweisen, dass nach einem "new" ein "delete" folgen muss, was aber nicht automatisch in einer unterlagteren Struktur/Klasse stattfinden sollte. Wann und wo "new" und "delete" am besten aufgerufen werden ist eine andere Diskussion.



  • Weil's noch nicht genannt wurde: boost::ptr_vector ist genau für diesen Fall gedacht und räumt automatisch auf.



  • Wieso wollen eigentlich so viele Leute Zeiger in Containern speichern? Was hat man von der Speicherverwaltung eines Containers, wenn man trotzdem die ganze Zeit manuell sicherstellen muss, dass alles richtig kopiert und freigegeben wird?

    Man braucht Zeiger in Containern zum Beispiel für Polymorphie (Slicing), und dann empfehlen sich Smart-Pointer oder Pointer-Container. Aber in den meisten Fällen ist es unnötig. Hier wäre wohl ein std::vector<TKlasse> angebrachter.


Log in to reply