Invalid Pointer
-
Hallo
Ich habe da ein kleine Problem mit meinem Programm.
Ich bekomme bei zweiten Aufruf von delete immer"Invalid Pointer: =0x0...."
Leider kann ich nicht nachvollziehen warum das so ist.
In folgendem Code tritt der Fehler auf:
bool TransversalList2::addTransversal(Transversal transversal) { counter++; int *temp = list; list = new int[counter*this->size]; if(list == NULL) return false; for(int i = 0; i<counter-1; i++) { if(!this->copyTransversal(i,temp)) return false; } this->copyTransversal(transversal); delete [] temp; return true; }zum Verständniss:
int *list; // wird in der Methode addTransversal immer wieder erweitert int *temp; // wir benutzt damit beim erweitern von list die Daten nicht verloren gehenBeim ersten Duchlauf ist
temp == NULL, da noch kein Eintrag in list exitiert.
Beim zweiten Durchlauf sind Einträge in list drin.
Wenn jetzt unten dasdelete [] tempaufgerufen wird, dann bekomme ich die Fehlermeldung
Invalid Pointer: 0x0...
Ich habe keine Idee warum dem so ist.
Hoffentlich kann mir jemand weiterhelfen.CU
MartinPS: Nachfolgend die überladene Methode
copyTransversal()
, für den Fall das der Fehler sich dort befindet.
void TransversalList2::copyTransversal(Transversal transversal) { int *cells = transversal.getCells(); for(int i=0;i<this->size;i++) list[counter-1*this->size+i] = cells[i]; } bool TransversalList2::copyTransversal(int pos, int *temp) { for(int i=0;i<this->size;i++) list[pos*this->size+i] = temp[pos*this->size+i]; return true; }
-
Was macht copyTransversal?
Warum benutzt du nicht std::vector?
-
Ich habe den Code für die Methode copyTransversal() angehangen, der bringt hoffentlich etwas Licht in die Sahe.

Nun ich nehm nicht std:vector, da ich nicht wußte das die sowas macht, ausserdem wollte ich mein Array möglichst speicherschonend aufbauen, so das ich es halt selbst gemacht habe.
-
Der Fehler liegt in der Klammerung in der Routine copyTransversal
void TransversalList2::copyTransversal(Transversal transversal) { int *cells = transversal.getCells(); for(int i=0;i<this->size;i++) list[ (counter-1) *this->size+i] = cells[i]; // ^ ^ }BTW, die ganze bool Rückgaberei finde ich (zumindest) in realen Projekten nervig. Dein copyTransversal gibt nur true zurück, die Prüfung ist überflüssig. Du würdest ein Speicherleck produzieren (weil das delete nicht aufgerufen wird), wenn es doch false liefert. Müsste ich einen Fehler in dieser Routine suchen, würde ich zuerst über das return beim copyTransversal stolpern und damit Zeit verplempern.
Genauso wird new niemals NULL zurückliefern (es sei denn Du übersetzt ohne exceptions). Damit würde addTransversal auch niemals false liefern...
-
Keine Ahnung was du da machst. Mir kommt aber deine indizierung etwas komisch vor.
zb.void TransversalList2::copyTransversal(Transversal transversal) { int *cells = transversal.getCells(); for(int i=0;i<this->size;i++) list[counter-1*this->size+i] = cells[i]; }Bist du sicher das da keine klammern fehlen ?
Du berechnest:list[counter - (1*this->size) + i] = cells[i];Kurt
Edit: war etwas langsam
-
LE_Shatai schrieb:
Ich habe den Code für die Methode copyTransversal() angehangen, der bringt hoffentlich etwas Licht in die Sahe.

Das hier ist ziemlich seltsam:
list[counter-1*this->size+i]Warum eins mal? Oder hast du vergessen, dass Punktrechnung vor Strichrechnung geht?
Das Problem liegt vermutlich darin, dass du irgendwo mit einem ungültigen Index auf ein Array zugreifst.
-
Ok, Problem gelöst.
Dein copyTransversal gibt nur true zurück[...]
Das war ein Copy'n'Paste Fehler. Ich hab es korrigiert.
Ich hatte vorher über malloc Speicher angefordert, und ich hatte geprüft ob das auch geklappt hat.
Da ich dann aber dasa ganze umgestellt hatte, ist das bool hinfällig geworden, hatte es aber vergessen rauszunehmen.
Dennoch tnx für den Hinweis.Oder hast du vergessen, dass Punktrechnung vor Strichrechnung geht?
Ja, diese Stelle hatte ich beim umschreiben übersehen.

Da lag auch der Fehler.Keine Ahnung was du da machst. Mir kommt aber deine indizierung etwas komisch vor.
*g* Ich kann verstehen, das das ganze komisch aussieht.
Diese Indizierung ist die Abbildung eines 2-dimensionalen Arrays auf ein 1-dimensionales.
Nachzulesen ist hier: http://www.softgames.de/developia/viewarticle.php?cid=19547Nochmals danke an alle.

CU
Martin
-
btw:
Lass
if(list == NULL) return false;weg. new gibt niemals einen Nullzeiger zurück. Wenn du das willst, solltest du dir new(std::nothrow) anschaun.