Frage zur std vector clear Methode
-
Hallo !
Ich habe einen Vektor aus Zeigern, d.h.
vector<T*>* v = new vector<T*>(); v->push_back( new T() ); v->push_back( new T() ); v->clear();
Sind nach dem v.clear() eigentlich auch die Speicherbereiche für die Ts wieder frei ?
Grüße
Tom
-
nein
-
D.h. dann, daß ich das so machen muß ?
vector<T*>* v = new vector<T*>(); v->push_back( new T() ); v->push_back( new T() ); for( unsigned int i = 0 ; i < v->size() ; ++i ) delete v->at(i); v->clear();
-
Ja.
Du kannst aber auch (und das ist sinnvoll, wenn es darum geht, polymorphe Objekte zu verwalten) den entsprechenden Boost.PointerContainer
(also ptr_vector) verwenden.Außerdem solltest du dir angewöhnen, Iteratoren zu verwenden, bzw. etwas aus <algorithm>:
void do_delete (T* p) { delete p; } // ... std::for_each (v->begin (), v->end (), do_delete); // oder for (vector<T*>::iterator i = v->begin (); i != v->end (); ++i) delete *i;
-
Um sich aber bei den Iteratoren nicht nen Finger zu brechen, weil die Definitionen unendlich lang werden, sollte man ein typedef für seinen Container definieren. Naja, zum Glück wird mit C++0x alles besser, da schreibt man dann nur auto hin.
-
Okay, wenn ich dann also nur v->clear() aufrufe bleibt der Speicher belegt, so daß ich defacto niemals wieder drauf zugreifen kann (falls ich keine Sicherheitskopie des Pointers gemacht habe).
Wenn ich das Programm jetzt beende, was passiert dann mit dem allozierten Speicher. Wird der vom Betriebssystem automatisch wieder frei gegeben ?
-
.filmor schrieb:
Du kannst aber auch (und das ist sinnvoll, wenn es darum geht, polymorphe Objekte zu verwalten) den entsprechenden Boost.PointerContainer
(also ptr_vector) verwenden.Bisher sollte man lieber noch die Finger von Boost lassen.
Es ist noch nicht komplett sicher, was davon in den Standard übernommen wird.
-
noboost schrieb:
.filmor schrieb:
Du kannst aber auch (und das ist sinnvoll, wenn es darum geht, polymorphe Objekte zu verwalten) den entsprechenden Boost.PointerContainer
(also ptr_vector) verwenden.Bisher sollte man lieber noch die Finger von Boost lassen.
Es ist noch nicht komplett sicher, was davon in den Standard übernommen wird.Und welche Relevanz hat das?
-
Und welche Relevanz hat das?
Ganz einfach.
Um seine Projekte standardkonform zu halten (sollte eigentliche oberste Prioität eines jeden C++ Programmierers sein) Finger weg von Boost.
Ist das nicht Relevant genug ?
-
Vor allen Dingen gibt es eine standardkonforme Möglichkeit, die hier auch schon gepostet wurde, und der "Boost Variante" vorzuziehen ist.
-
seit wann sind projekte, die boost verwenden, NICHT standardkonform (per se) ?
-
*lol*
seitdem boost nicht standard ist.
-
camper schrieb:
seit wann sind projekte, die boost verwenden, NICHT standardkonform (per se) ?
Jaja es gibt jetzt sogar schon Leute die meinen boost ist standard, nur weil sie es täglich nutzen.
-
Verdammt, trollt woanders. Standardkonform heißt, dass etwas dem Standard entspricht, nicht, dass es im Standard festgelegt ist. Jedes sprachlich richtige Codefragment ist standardkonform.
-
Verdammt, trollt woanders.
dito.
boost != standard == bost != standardkonform
kapier es endlich, oder les dich schlau du trollnase.
-
**rofl**
und die Borland Vcl,QT etc. ist auch Standard.
Echt cool was sich hier für Leute outen.
-
Wenns danach geht, hätten C++-Programme keine GUI, keine 3D-Grafik, kein Netzwerk... ja, sie könnten nicht mal den Konsoleninhalt löschen.
-
Eure eigenen Klassen sind dann wohl auch nicht Standardkonform
-
Okay, wenn ich dann also nur v->clear() aufrufe bleibt der Speicher belegt, so daß ich defacto niemals wieder drauf zugreifen kann (falls ich keine Sicherheitskopie des Pointers gemacht habe).
Wenn ich das Programm jetzt beende, was passiert dann mit dem allozierten Speicher. Wird der vom Betriebssystem automatisch wieder frei gegeben ?
-
Ja. Es gibt keine "globalen" Speicherlöcher, für die man das System neustarten müsste. (Was einen aber nicht dazu verleiten sollte, auf delete's am Ende zu verzichten, Destruktoraufrufe können wichtig sein).