Dieser Code wird explodieren, oder? Sobald die Schleife beendet ist, werden die ursprünglichen Instanzen mit allen ihren inneren Elementen abstürzen, wenn sie also keine PODs sind, wird jede Methode wie do_stuff
, die Zugriff auf Mitglieder von B
benötigt, einen Segmentierungsfehler auslösen, richtig?
Also, gibt es eine Möglichkeit, dies ohne einen Zeiger zu tun? Oder musst du das tun:
%Vor%Der erste Code ist besser als der zweite.
Die B
-Instanzen werden verschoben seit C ++ 11 sein / kopiert pre-C ++ 11 in den Vektor, damit sie nach der Schleife nicht aus dem Gültigkeitsbereich fallen - nur nachdem der Vektor außerhalb des Gültigkeitsbereichs liegt .
Wenn Sie die absolut optimale Leistung erhalten möchten, dann tun Sie dies:
%Vor%Dies garantiert nur eine Neuzuweisung, und die Elemente werden direkt im Vektor konstruiert (anstatt sie dorthin zu verschieben oder zu kopieren), wie in den Kommentaren von Marc Glisse erwähnt.
Das erste Codebeispiel ist gültig.
std::vector
erstellt eine Kopie der Objekte, an die Sie sie mit push_back
übergeben (oder wird sie mit C ++ 11 verschieben, wenn Sie es sind ein temporäres drücken) und es wird alle Instanzen am Leben erhalten, solange der Vektor selbst lebt.
Die Zerstörung tritt auf, wenn Sie die Funktion beenden und nicht, wenn Sie die Schleife verlassen.
Nein, std::vector
übernimmt die Eigentümerschaft seiner Mitglieder, so dass der ursprüngliche Code funktioniert.
Tags und Links c++