Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » std::vector Speicher freigeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.08.2007, 17:18 Uhr
Pler
Einer von Vielen
(Operator)


Hallo!

Es sieht ganz so aus, als würde nach einem
myvec.clear().
Der Speicher dahinter nicht freigegeben werden.
Kann ich mich wenigestens drauf verlassen, dass er dann freigegeben wird, wenn woanders Speicher benötigt wird?

Also dieses Verhalten kommt mir schon ein wenig komisch vor.

Kann mir jemand weiterhelfen?

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.08.2007, 17:41 Uhr
Kest
saint


Hi!

Also >clear< ist eigentlich eine Abkürzung für >erase(begin,end)<. Und >erase< bei Vector-Containern bewirkt, dass die Elemente verschoben werden.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 20.08.2007 um 17:43 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.08.2007, 17:49 Uhr
Pler
Einer von Vielen
(Operator)


aha, und wohin?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.08.2007, 18:02 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Ein vector ist eigentlich nichts anderes als ein allokierter Speicherbereich. Damit nicht bei jedem Einfuegen eines neuen Elements wieder ein realloc() aufgerufen werden muss, reserviert der vector gleich z.B. 16 Elemente auf einmal, merkt sich aber, wie viele genau drin stehen. Wird jetzt das 17. Element eingefuegt, reserviert der vector je nach Strategie z.B. gleich 32 Elemente und so weiter. Beim clear() sagt sich der vector lediglich, OK, dann hab ich halt ab sofort 0 Elemente in meinem immer noch reservierten Speicher... alles im Namen der Performance
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.08.2007, 18:40 Uhr
(un)wissender
Niveauwart


Guckst du hier:

Zitat von CodeGuru:

Swapping contents

Sometimes, it is practical to be able to swap() the contents of two vectors. A common application is forcing a vector to release the memory it holds. We have seen that erasing the elements or clearing the vector doesn't influence its capacity() (in other words, the memory allocated). We need to do a small trick:


C++:
std::vector<int> v;
//...
v.clear();
v.swap(std::vector<int>(v));



Normally (see below), vectors simply swap their guts. In the previous example, we create a temporary vector by using the copy ctor and swap() its contents with v. The temporary object will receive the entire memory held by v and v will receive the memory held by the temporary object—which is likely to allocate nothing on creation. The temporarily created vector is destroyed at the end of the above statement, and all the memory formally held by v is freed.




Bearbeitung:

Google ist dein Freund.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 20.08.2007 um 18:45 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.08.2007, 20:03 Uhr
Pler
Einer von Vielen
(Operator)


Danke.
Das mit swap hab ich auch schon gefunden.
Ich wollte aber noch mal nachfragen wie das mit dem Speicher ist. Der wird also offensichtlich auch nicht freigegeben, wenn man an ner anderen Stelle wieder Speicher braucht. Das hätte mir ja gereicht.
Hätte mich auch sehr gewundert wenn das so ist.

Also werd ich das dann mal mit swap probieren.
Vielen Dank.


Bearbeitung:
Langsam kotzt mich C(++) richtig an.

Dieser Post wurde am 20.08.2007 um 20:04 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.08.2007, 21:36 Uhr
Pler
Einer von Vielen
(Operator)


Ich habe jetzt folgendes geschrieben, aber leider gehts noch nicht.
Ist schon so gemeint, oder?


C++:
for( unsigned int i = 0; i < v.size(); i++)
    {
        for( unsigned int j = 0; j < v[i].size(); j++)
        {
            v[i][j].clear();
            v[i][j].swap(std::vector<double>(v[i][j]));
        }
        v[i].clear();
        v[i].swap(std::vector<std::vector<double> >(v[i]));
    }
    v.clear();
    v.swap(std::vector<std::vector<std::vector<double> > >(v));




Edit:
Ähm, ich glaub es geht doch. Der Speicher wird an ner anderen Stelle belegt...

Dieser Post wurde am 20.08.2007 um 21:44 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: