Löscht std::vector seine Elemente am Ende aus dem Speicher?
-
Halli Hallo,
folgender Sachverhalt:
struct stXY { float x; float y; stXY(float fx, float fy) { x = fx; y = fy; }; }; funktionsrumpf { std::vector<stXY*> Vec; Vec.push_back(new stXY(0.0, 0.1)); Vec.push_back(new stXY(0.1, 0.2)); Vec.push_back(new stXY(0.2, 0.3)); }Was passiert mit den stXY* nach dem verlassen der Funktion? Werden die nur aus dem Vector gelöscht oder auch im Speicher zerstört? Wenn nicht, dann müßte man ja am Ende nochmal durch den Vector durchiterieren und alle Elemente getrennt deleten.

-
Warum tust Du auch Zeiger in den Vector?

Die Regel ist ganz einfach: Ein Vector löscht all seine Elemente, wenn seine Lebensdauer abgelaufen ist. Wenn das Element des Vectors T* ist, werden die Zeiger gelöscht, nicht aber das worauf sie zeigen (warum auch - oder anders: Wenn das Element des Vectors kein Zeigertyp ist, wie soll man dann das worauf es zeigt löschen?)
-
Wie es LordJaxom gesagt hat. Wenn du trotzdem möchtest, dass der Container die Zeiger löscht und das möglichst einfach, dann gibt es wohl zwei Wege:
1. Mal wieder Boost: http://www.boost.org/doc/libs/1_35_0/libs/ptr_container/doc/ptr_container.html
2. Du erstellst dir sowas:
struct SHeapDelete { template<typename T> void operator ()(T*& rpT) { delete rpT; rpT = 0; } } // Du kannst auch sowas noch erstellen: template<typename C> void heap_delete(C& rContainer) { std::for_each(rContainer.begin(), rContainer.end(), SHeapDelete); } // Und dann in der main: int main() { std::vector<int> Vec; Vec.push_back(new int); Vec.push_back(new int); // usw. std::for_each(Vec.begin(), Vec.end(), SHeapDelete); // oder heap_delete(Vec); return 0; }Grüssli
-
Alles klar. Danke.
