2013-10-25 8 views
6

Ich bin mir nicht sicher, was ich davon machen soll - bitte sagen Sie mir, was mit dem Code unten falsch ist. Ich habe meinen Code geändert, um ihn auf die einfachsten Bedingungen zu reduzieren. Es gibt einen std :: vector mit einer Menge MyNode-Objekten. Der erste Schritt besteht darin, einen konstanten Verweis auf eines der Datenelemente eines dieser Knoten zu erhalten (Daten m_data) - im Beispiel unten gibt es nur einen Knoten, bevor der zweite Knoten eingefügt wird, wie unten gezeigt:C++ Referenz ändert sich wenn push_back neues Element zu std :: vector

const cv::Data& currData = m_nodesVector[currIndex].GetData(); 
MyNode node(...); 
m_nodesVector.push_back(node); 

Bei genau dem vector :: push_back Aufruf ändert sich der Wert von currData !! Ich verstehe es einfach nicht. Wie kann das Einfügen eines neuen Knotens in den Vektor den Wert auf die Daten des ersten Knotens ändern? !! Beachten Sie, dass sich der Wert beim "Erstellen" des 2. Knotens nicht ändert, sondern bei der Einfügeoperation in den std :: vector. Ich meine, ich nehme an, dass std :: vector etwas Speicher neu mischen kann, aber das sollte das Referenzrecht nicht ändern ??

Compiler = VS 2012

Danke Jungs. Sehr geschätzt.

Antwort

14

Wie kann das Einfügen eines neuen Knotens in den Vektor den Wert auf die Daten des ersten Knotens ändern? !!

Da die Elemente eines Vektors in einem zusammenhängenden Array gespeichert sind. Wenn im Array kein Platz mehr ist, werden alle Elemente in ein größeres Element verschoben, wodurch alle Iteratoren, Zeiger und Referenzen auf sie ungültig werden.

Ich vermute, std :: Vektor kann einige Speicher neu mischen, aber das sollte die Referenz nicht ändern ??

Natürlich würde es. Eine Referenz bezieht sich auf ein bestimmtes Objekt an einer bestimmten Adresse; Das Objekt wird nicht verfolgt, wenn es verschoben wird. Wenn Sie stabile Referenzen benötigen, verwenden Sie deque; oder (wenn möglich) verwenden Sie reserve, um die Kapazität des Vektors so groß zu setzen, dass alles enthalten ist, was Sie hinzufügen können. Verweise werden nur dann ungültig gemacht, wenn eine Neuzuweisung erforderlich ist. Dies geschieht nur, wenn Sie versuchen, über die aktuelle Kapazität hinaus zu wachsen.

Alternativ können Sie den Index des Objekts speichern, anstatt eine Referenz darauf.

3

Wenn Sie einem Vektor ein neues Element hinzufügen, werden die darin enthaltenen Daten möglicherweise dem neuen Element zugewiesen. Dies bedeutet, dass Verweise und Zeiger auf die Elemente (und ihre Mitglieder) ungültig sind.

0

Sie können den Zeiger aktualisieren, wenn er bewegt wird, durch den Einzug Konstruktor:

A(A&& a): b(a.b) { b.ptr = this; }; 
Verwandte Themen