Wie einen Vektor deleten?
-
Hallo,
ich habe eine Methode, die einen Pointer auf einen Vektor zurueck liefert. Nun frage ich mich jedoch, wer ist dafür verantwortlich, den hier durch new reservierten Speicher wieder aufzuräumen? In der Methode geht ja nicht. Über den Destruktor geht ja auch nicht, da der VectorPointer ja keine MemberVariable ist. Also müsset die aufrufende Methode delte auf vekPtr aufrufen. Ist das korrekt so? Oder gibt es hier einen besseren "Stil", den man anwenden sollte?
template <class T> vector< FOO<T>* >* BAR<T>::getAll() { vector< FOO<T>* > *vectPtr = new vector< FOO<T>* >(); // Irgendwas ... return vectPtr; }
Danke!
Grüsse
Markus
-
In der Methode geht ja nicht.
Da hast du wohl recht, denn wenn du vor dem "retrun" löschst, ist ja "nix mehr da" zum zurückgeben.
Also müsset die aufrufende Methode delte auf vekPtr aufrufen. Ist das korrekt so?
Ich glaub schon, die Frage ist natürlich, warum überhaupt der Rückgabewert ein Pointer sein muss. Die Vektorelemente können ja ruhig Zeiger sein, aber der Vektor selber...?
-
SegmentationFault schrieb:
Die Vektorelemente können ja ruhig Zeiger sein, aber der Vektor selber...?
Hmm, ok. Aber dann muss ich doch trotzdem aufräumen, oder?
-
Hallo,
wenn du mit new Speicher allokierst, musst du für jedes Element des Vectors delete aufrufen.
-
wie wärs mit auto_ptr. <algorithm> fällt dann natürlich aus...
template <class T> class Bar { public: void addAllBarsToVector(vector< auto_ptr< Bar<T> > >& vec) { for (int i = 0; i < foo; i++) { vec.push_back(new Bar<T> (i)); } }
-
das ist doch kacke.
Dann lieber irgendnen smart-pointer von boost, da kannste dann wenigstens nach wie vor alles benutzen.MfG Jester
-
Jester schrieb:
das ist doch kacke.
Kannst du mir erklären warum?
Danke
-
Weil Du keine Algorithmen verwenden kannst.
Und auch keine Kopie von dem Containter machen kannst.
Zumindest nicht mehr mit dem Copy-Konstruktor.
-
Achso. Leuchtet ein. Nochmals Danke
-
auto schrieb:
wie wärs mit auto_ptr
Kurz: Falsch.
Einen standardkonformen auto_ptr kann und darf man nicht in einen STL-Container packen und einen nicht konformen auto_ptr sollte man nicht in einen STL-Container packen, da der Code dadurch unportabel wird.http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=auto_ptr#Answ
-
CarstenJ schrieb:
Hallo,
wenn du mit new Speicher allokierst, musst du für jedes Element des Vectors delete aufrufen.
Macht das nicht der Destruktor von vector? Reicht es nicht wenn ich einfach delete vekPtr mache? Muss ich echt durchiterieren und für jedes Element im vector delete aufrufen?
-
Wenn der Vector Pointer aufnehmen soll, enthält er Pointer,
und keine Objekte. Du musst also jedes Objekt wieder Löschen.Devil
-
Markus3: Nimm am besten einen Shared Pointer. zum Beispiel aus boost den boost::shared_ptr von www.boost.org