Frage zu vector - wie Speicher freigeben



  • Vermutlich ist die Anwort ganz einfach. Ich benutze inwischen (bekehrt durch einige Leute hier) vector für arrays anstatt die Standard Arrays. Jetzt ist mir aber unklar wann und wie der Speicher wieder freigegeben wird.

    Matthias



  • kleines Beispiel gefällig:

    void foo()
    {
      std::vector< int > v;
      v.push_back(5);
    } //<-- hier wird der Destruktor von v aufgerufen
      //    damit sollte der Speicher freigegeben sein.
    

    Gruß
    Don06



  • Wenn du den vector am Stack angelegt hast (wohl der Fall) wird er dann freigegeben wenn er den Scope verlässt - also analog zu all deinen ints, doubles und anderen Variablen.

    Wenn er den Scope verlässt, wird der Destruktor aufgerufen, in dem wird dann der intern im vector verwaltete dynamische Speicher freigegeben.

    MfG SideWinder



  • SideWinder schrieb:

    Wenn er den Scope verlässt, wird der Destruktor aufgerufen, in dem wird dann der intern im vector verwaltete dynamische Speicher freigegeben.

    Ok, das hatte ich mir schon gedacht, konnte aber im Netz keine Bestätigung finden.

    Und wenn ich zwischendurch den Speicherbedarf verkleinern möchte, kann ich das dann durch ein resize erreichen ?

    Matthias



  • Ja. Gleich ein Tip aber noch für die Zukunft: Es gibt einen Unterschied zwischen der verwendeten Größe und der tatsächlichen Größe des Speichers der am Heap reserviert ist (das hat damit zu tun, die Anzahl der new-Aufrufe zu minimieren). So kann es durchaus sein, dass dein vector zwar nur 5 Elemente enthält aber bereits für 20 reserviert ist weil davon ausgegangen wird, dass du bald noch mehr Elemente einfügen wirst.

    Tatsächlich verwendete Größe: size() / resize()
    Bereits reservierte Größe: capacity() / reserve()

    MfG SideWinder



  • Wobei reserve() aber nur dafür sorgt, dass für *mindestens* (nicht maximal) soviele Elemente Speicher reserviert ist.

    MfG SideWinder



  • Sollte der vector aber mit new angelegte Objekte enthalten musst du aber immer noch selbst deleten.

    std::vector<int*> v;
    for(int i=0;i<10;++i)
        v.push_back(new int);
    //was damit machen
    for(int i=0;i<v.size();++i)
        delete v[i];
    //Destruktion des vectors selbst wird vom Destruktor sauber erledigt
    

    Also weiterhin nach der Regel: pro new ein delete.


Log in to reply