Ich habe kleines Stück Code, der einen Vektor der Klasse (Vector2) für 2-dimensionale Vertices und einen Vektor der Template-Klasse DynamicLine enthält, die Vector2-Objekt für Argument verwendet.Warum werden meine Zeiger ungültig, wenn ich vector.reserve() nicht verwende?
std::vector<Vector2> m_coords;
std::vector<DynamicLine<Vector2>> m_lines;
Vector2 *lineVec = NULL;
bool draw = true;
case DrawingWidgetState::ADD_VERTEX_SELECTED:{
for(auto it = m_coords.begin(); it != m_coords.end(); it++)
if(it->distanceFrom(Vector2(event->x(), event->y())) < 20 && !m_coords.empty()){
draw = false;
break;
}
if(draw){
if(event->x() < m_mainWindow->width() - 10 && event->x() >= 10
&& event->y() < m_mainWindow->height() && event->y() >= 10) {
m_coords.push_back(Vector2(event->x(), event->y()));
update();
}
}
break;
}
case DrawingWidgetState::ADD_LINE_SELECTED:{
for(auto it = m_coords.begin(); it != m_coords.end(); it++)
if(it->distanceFrom(Vector2(event->x(), event->y())) < 10){
if(!i){
lineVec = &(*it);
i++;
}
else{
m_lines.push_back(DynamicLine<Vector2>(lineVec, &(*it)));
i = 0;
}
update();
break;
}
break;
}
Problem ist das nächste. Zum Beispiel, wenn ich zwei Eckpunkte und eine Linie zwischen ihnen hinzufügen, dann funktioniert alles gut. Aber wenn ich jetzt einen anderen Eckpunkt (m_coords.push_back (Vector2 (event-> x(), event-> y())) hinzufügen), dann werden die Zeile dedaperas und Werte in m_lines Vektor in sehr zufällige große Zahlen geändert. Ich habe gelesen, dass Zeiger ungültig werden. Wenn Sie neue Werte in den Vektor schieben, werden einige schließlich erweitert. Ich habe auch mein Problem mit vector :: reserve behoben, aber da ich mir sicher bin, dass ich das nicht richtig mache, könnte mir bitte jemand erklären, wie ich vector :: reserve verwenden soll und warum ich das tun muss?
1) Fixieren Sie Ihre Einrückung. 2) Erstelle [mcve]. 3) Versuchen Sie, den Debugger zu verwenden, um durch Ihren Code zu gehen, während Sie die Werte der Variablen bei jedem Schritt prüfen. In dieser Reihenfolge. –