Simples Referenz-Problem
-
Hi,
habe eine Frage zu Referenzen. Ist folgender Code ok?
int x = 3; int& a = x; int& b = x;Also erlaubt C++, 2 Referenzen auf die selbe Variable zu setzen?
Bekomme nämlich Speicherzugriffsfehler, aber is nur ne Vermutung, dass es daran liegt.
MfG
D.Cent
-
Ist folgender Code ok?
Ja.
Also erlaubt C++, 2 Referenzen auf die selbe Variable zu setzen?
Ja.
Zeige doch mal etwas mehr code.
Simon
-
Jop. Das ist erlaubt. Wäre ja recht schwierig immer zu wissen, wie viele Referenzen auf eine Variable zeigen.

Es liegt also nicht an dem da, wenn du einen Speicherzugriffsfehler bekommst. (Du musst einfach darauf achten, dass der referenzierte Speicherbereich gültig ist).
Kann es sein, dass eine solche Referenz auf einen dynamisch angeforderten Speicherbereich zeigt? - Also in etwa so:int* p = new int; int& rp = *p;
-
OK, danke. Ne dann wars glaub ich,dass man auf ne Referenz nicht nochmal eine draufsetzen darf...
Der Fehler könnte auch von ganz anderen Dingen kommen. Ich habe die Referenz auf eine Element eines std::vector gesetzt. k.A. ob das dynamisch ist.
-
D.Cent schrieb:
OK, danke. Ne dann wars glaub ich,dass man auf ne Referenz nicht nochmal eine draufsetzen darf...
Bei dem Versuch würdest du die Referenz automatisch auf das referenzierte Objekt und nicht die Referenz setzen. Das ginge also schon.
D.Cent schrieb:
Der Fehler könnte auch von ganz anderen Dingen kommen. Ich habe die Referenz auf eine Element eines std::vector gesetzt. k.A. ob das dynamisch ist.
Ja, das solltest du nicht. Wenn du Operationen am Container durchführst, kann es sein, dass die Elemente intern verschoben oder zerstört werden, wodurch Referenzen ungültig werden. Wenn du willst, dass Zeiger, Referenzen und Iteratoren immer gültig bleiben (natürlich ausser wenn das Element gelöscht wird), nimm
std::list.
-
Bitte, findet jemand den Bug! Ich werd' wahnsinnig

Valgrind meckert, dass später im Programm eine Referenz falsch ist, die bei dem
"!!!" gesetzt wird...for(unsigned int count2=0; count2 < face_count; ++count2) { SMeshBuffer* face_buffer = new SMeshBuffer; ODFLFile->read(&connects, 2); short start_point, second_point, third_point; ODFLFile->read(&start_point, 2); ODFLFile->read(&second_point, 2); face_buffer->Vertices.push_back(odfl_verts.at(start_point) ); face_buffer->Vertices.push_back(odfl_verts.at(second_point) ); // !!! for(short connect_count=1; connect_count < connects-1; ++connect_count) { ODFLFile->read(&third_point, 2); face_buffer->Vertices.push_back( odfl_verts.at(third_point) ); face_buffer->Indices.push_back(start_point); face_buffer->Indices.push_back(second_point); face_buffer->Indices.push_back(third_point); second_point = third_point; ++triangle_count; } odfl_faces.push_back(tmp_face); mesh->addMeshBuffer(face_buffer); face_buffer->drop(); }
-
D.Cent schrieb:
Bitte, findet jemand den Bug! Ich werd' wahnsinnig

Wie wärs, wenn du den Debugger einsetzen würdest?

Ich habe dir zum Beispiel gesagt, dass du keine Referenzen auf
std::vector-Elemente setzen solltest (es sei denn, es besteht eine Garantie, dass der Container nicht geändert wird). Daran liegts also nicht? Prüfe doch mal deine Variablen.
-
Der std::vector wird nach seiner Erstellung nur noch gelesen, das ist es nicht. Der Debugger sagt nix.
Noch weitere Ideen?
-
D.Cent schrieb:
Der Debugger sagt nix.
Wie ist das zu verstehen? Du hast ihn mit grosser Wahrscheinlichkeit nicht richtig angewandt.