Fehler: free(): invalid next size (fast): 0x0000000001df82b0
-
Hallo zusammen,
ich bekomme beim Ausführen des ganz unten stehenden Codes die im Titel genannte Fehlermeldung.
Ich habe bereits ein bisschen recherchiert, und glaube das ganze auf die Stelle:
int * x = new int[3]; int * n = new int[3]; /* ... */ delete [] x; delete [] n;
eingrenzen zu können. In den Beiträgen die ich gefunden habe, heißt es, hier könnte versucht werden die Pointer mehrfach zu löschen oder sowas, ich sehe das in meinem Code aber nicht.
Weiß jemand eine Lösung für das Problem?
Danke,
foxxHier der komplette Code-Abschnitt um den es geht:
int Grid::moveCell(const int * src,const int * dst, int idx){ /* Sind Quelle und Ziel im Gitter? */ if(src[0]<0||src[0]>max_int[0]||src[1]<0||src[1]>max_int[1]||src[2]<0||src[2]>max_int[2]||dst[0]<0||dst[0]>max_int[0]||dst[1]<0||dst[1]>max_int[1]||dst[2]<0||dst[2]>max_int[2]) return M_FAIL; /* Pointer für Quell- und Ziellisten */ list<Cell*> * src_ptr = getElement(src[0],src[1],src[2]); list<Cell*> * dst_ptr = getElement(dst[0],dst[1],dst[2]); Cell * tmp; /* Quelle leer? */ if(src_ptr->empty()) return M_FAIL; for(list<Cell*>::iterator it=src_ptr->begin(); it!=src_ptr->end(); ++it){ /* Zelle gefunden? */ if((*it)->returnI()==idx){ /* Zelle an alter Postion löschen und an neuer einfügen */ tmp = (*it); it = src_ptr->erase(it); dst_ptr->push_back(tmp); return M_SUCCESS; } } /* Wenn die Zelle nicht gefunden wurde, kann auch nichts verschoben werden */ return M_FAIL; } int Grid::updateGridcell(int i, int j, int k){ list<Cell*> * src = getElement(i,j,k); /* nichts zu tun */ if(src->empty()) return M_SUCCESS; cout << "Making New x, n " << flush; int * x = new int[3]; int * n = new int[3]; n[0] = i; n[1] = j; n[2] = k; cout << "Doing something wiht the values ... " << flush; for(list<Cell*>::iterator it=src->begin(); it!=src->end(); ++it){ if(periodic) (*it)->update_periodic(max[0],max[1],max[2]); else (*it)->update_boxed(max[0],max[1],max[2]); x[0] = (int)((*it)->returnX(0)/r_cut); x[1] = (int)((*it)->returnX(1)/r_cut); x[2] = (int)((*it)->returnX(2)/r_cut); if(x[0]!=i||x[1]!=j||x[2]!=k){ moveCell(n,x,(*it)->returnI()); it = src->begin(); } } cout << "Done! Try deleting! ... " << flush; /* Diese Ausgabe wird noch gemacht, dann bricht er ab! */ delete [] x; delete [] n; cout << "done! " << flush; return M_SUCCESS; }
-
omg
-
1. Gibts dafür 'nen Grund, warum du Arrays mit statischer Größe dynamisch anlegst?
2. Selbst wenn es dafür einen Grund geben sollte, gibt es einen Grund, dies von Hand zu machen, anstatt std::vector zu benutzen?
3. Und selbst wenn es dafür einen Grund geben sollte, gibt es einen Grund, das nicht in einer eigenen, kleinen, RAII-fähigen Klasse zu kapseln
4. Und wenn es dafür einen Grund geben sollte: Darf ich ihn erfahren, du wärst vermutlich der erste Mensch, der ihn entdeckt hat.Zum Problem: Da da mit dem new und delete in so einfacher Anordnung nicht viel schiefgehen sollte, vermute ich mal stark, dass der Grund dazwischen liegt. Ein bisschen über die Arraygrenzen hinausschreiben ist eine typische Ursache für so etwas. Da du dazwischen wilde Sachen machst, würde mich das gar nicht wundern, der Code ist jedoch ein bisschen unübersichtlich, da mag ich mich nicht durchschlagen.
Was soll das denn am Ende werden? Da muss man jetzt nicht den Code korrigieren, das kann man garantiert durch Neuschreiben viel besser machen.
-
Hallo,
typischer Fall von zu lange gearbeitet
klar geht das statische allozieren der Arrays, ich hatte nur irgendwie im Kopf, dass man sie dann nicht mehr an eine Funktion übergeben kann (warum auch immer...)
Naja, mit den statischen funktioniert es jetzt, danke für den Hinweis.
Und die Sachen dazwischen sind garnicht soo wild...
-
SeppJ wollte eigentlich sagen: Gibt es überhaupt nen Grund, Arrays zu verwenden?
-
So wie ich das sehe, brauchst du hier weder Arrays, noch so viele Zeiger, noch
new
,new[]
,delete
oderdelete[]
. Wenn es nicht unbedingt sein muss, lass von solchen fehleranfälligen Low-Level-Mechanismen die Finger.Ach ja, und du kennst Schleifen? (Zeile 3...)
-
314159265358979 schrieb:
SeppJ wollte eigentlich sagen: Gibt es überhaupt nen Grund, Arrays zu verwenden?
Das wollte ich eigentlich gar nicht sagen. Ein statisches
int foo[3]
ist nichts, was mich groß stören würde. Wenn man weiß, wie man damit umgeht.
-
Hm, okay
-
314159265358979 schrieb:
Hm, okay
Es allerdings zwischen Funktionen rumzureichen, wild zu casten, usw. würde ich nicht als guten Umgang bezeichen
.
-
Gerade wollte ich dir ein absolut hirnloses Beispiel für einen Array-Cast zeigen, stellt sich heraus, dass es beim ideone-GCC nur mit einem Zeiger, nicht aber mit einem Array funktioniert. weird.
const char* data = "\xB8\x2A\x00\x00\x00\xC3"; std::cout << reinterpret_cast<int(*)()>(data)();