Ist es nicht möglich, Instanzen in einer Schleife ohne Zeiger zu konstruieren?

7

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?

%Vor%

Also, gibt es eine Möglichkeit, dies ohne einen Zeiger zu tun? Oder musst du das tun:

%Vor%     
wolfdawn 30.08.2015, 17:08
quelle

4 Antworten

7

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.

    
emlai 30.08.2015, 18:01
quelle
12

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.

    
6502 30.08.2015 17:11
quelle
4

Nein, std::vector übernimmt die Eigentümerschaft seiner Mitglieder, so dass der ursprüngliche Code funktioniert.

    
Chris Beck 30.08.2015 17:11
quelle
3

std::vector kopiert die ihm zur Verfügung gestellten Objekte (zB nach push_back() ) und behält sie bei, bis der Vektor selbst zerstört wird.

Der erste Code ist also völlig in Ordnung, solange der Kopierkonstruktor von B ( B(const B&) ) korrekt implementiert ist.

    
Alex Lop. 30.08.2015 18:01
quelle

Tags und Links