std::vector als "behaelter" für std::vector
-
Hallo allerseits,
Würde folgender Code zu einem Speicherleck führen?
std::vector<std::vector<int> > A;
std::vector<int>* p_element = new std::vector<int>(1);
(*p_element)[0] = 42;A.push_back(*p_element);
/* Meine Annahme ist, dass im Folgenden zuerst die Destruktoren
der std::vector-Elemente von A aufgerufen werden und danach
der Destruktor von A. Da ich oben keinen Zeiger auf eine
std::vector-Instanz abspeichere, sondern die Instanz selber,
sollte es doch so ablaufen, oder nicht? */A.clear();
Gruß
reg
-
std::vector speichert Kopien, keine Referenzen. p_element wird auf diese Weise speichergeleckt; seine Kopie, die von A gehalten wird, wird ordnungsgemäß zerstört.
Allerdings kannst du Folgendes machen:
std::vector<std::vector<int> > A; std::vector<int> p_element; p_element.push_back(42); A.push_back(p_element);Natürlich ginge auch einfach
std::vector<std::vector<int> > A(1); A[0].push_back(42);
-
Hallo seldon,
Ich wusste gar nicht, dass std::vector Kopien anderer Objekte macht. Aber in meinem Programm hat es nun tatsächlich auch ohne Zeiger und new() funktioniert. Dadurch vereinfacht sich auch der Code und wird übersichtlicher.
Vielen Dank!
Gruß
reg
-
Du solltest manuelle Speicherverwaltung so oft wie möglich vermeiden. Sie ist nur selten wirklich nötig, und die dadurch entstehenden Probleme lohnen sich einfach nicht. Gerade wenn C++ bessere Techniken wie RAII bietet.
Falls du doch einmal Zeiger in Containern brauchst (z.B. wegen Polymorphie oder nicht-kopierbaren Objekten), könntest du dir überlegen, die Bibliothek Boost.PointerContainers anzuschauen.