Ich habe vor kurzem tiefer in C++ gegangen und meine Bugs scheinen komplex zu werden.C++: Wie ist es möglich, dass das Lesen von Daten den Speicher beeinträchtigen kann?
Ich habe einen Vektor von Objekten, jedes Objekt enthält einen Vektor von Schwimmern. Ich entschied, dass ich ein weiteres flaches Array erstellen musste, das alle Float-Werte aller Objekte in einem enthielt. Es ist ein wenig komplexer als das, aber der Kern des Problems ist, dass, während ich meine Objekte durchläuft, die die Float-Werte extrahieren, irgendwann wird mein Vektor von Objekten verändert oder auf eine seltsame Art und Weise beschädigt. (Meine Leseoperationen sind alle const Funktionen)
Ein anderes Beispiel war mit MPI. Ich wollte gerade anfangen, also wollte ich genau denselben Code auf zwei verschiedenen Knoten mit eigenem Speicher laufen lassen, ohne dass Daten übertragen wurden, alles sehr einfach. Zu meiner Überraschung habe ich Segmentierungsfehler und Nach-Stunden-Tracking, ich fand, dass eine Zuweisung einer Variablen eine völlig andere Variable auf NULL gesetzt.
So bin ich neugierig, wie ist es möglich, dass Lesevorgänge meine Datenstrukturen beeinflussen können. Ähnlich kann sich eine scheinbar nicht zusammenhängende Operation auf eine andere auswirken. Ich könnte keine Lösungen für meine Probleme mit diesen kurzen Beschreibungen erwarten, aber jeder Rat wird sehr geschätzt werden.
Update: Hier ist ein Teil des Codes, den ich ursprünglich nicht posten, weil ich nicht sicher bin, wie viel davon extrahiert werden kann, ohne das ganze System zu verstehen.
Eine Sache, die ich gerade herausgefunden habe, war, dass, als ich aufhörte, den Wert zu meinem flachen Array zuzuweisen und stattdessen nur cout'ed, die Seg-Fehler verschwanden. Vielleicht deklariere ich mein Array falsch, aber selbst wenn ich es war, bin ich mir nicht sicher, wie es den Objektvektor beeinflussen würde.
void xlMasterSlaveGpuEA::FillFlatGenes() {
int stringLength = pop->GetGenome(0).GetLength();
for (int i=0;i<pop->GetPopSize();i++)
for (int j=0;j<stringLength;j++)
flatGenes[(i*stringLength)+j]<< pop->GetGenome(i).GetFloatGene(j);
}
float xlVectorGenome::GetFloatGene(unsigned int i) const {
return GetGene(i);
}
meine Wohnung Array ist eine Memberfunktion
float * flatFitness;
im Konstruktor initailsed wie so:
flatFitness = new float(popSize);
Update 2:
Ich möchte nur darauf hinweisen, dass die Zwei Beispiele oben sind nicht verwandt, die erste ist nicht multi-threaded. Das zweite MPI-Beispiel ist technisch, aber MPI ist verteilter Speicher, und ich habe bewusst die einfachste Implementierung versucht, die mir einfällt, nämlich beide Maschinen, die Code unabhängig voneinander ausführen. Es gibt jedoch eine zusätzliche Detail, habe ich in einem condtional sagen
if node 1 then do bottom half of loop
if node 1 then do top half
Auch der Speicher isoliert werden sollten, sollten sie arbeiten, als ob sie nichts voneinander wissen .. aber diese Bedingung zu entfernen und machen beide Schleifen zu tun alle Würfel, beseitigt den Fehler
Können Sie eine verkürzte Version Ihres Codes veröffentlichen? Es ist sehr schwer zu sagen, was genau passieren könnte. – tgamblin
Könnten Sie den Schleifencode, wo Sie die Objekte im Vektor iterieren, posten ... möglicherweise treten Sie dort auf Speicher? – Balk
Lesevorgänge ändern Werte nicht. Es muss noch etwas in Ihrem Code sein. Ihr zweites Beispiel ist eine typische Situation einer Variablen, die auf den falschen Ort zeigt. – fbinder