dynamisches 2d-array löschen
-
hi,
habe da eine frage bezüglich dem löschen eines 2d-arrays
das steht in meinen konstruktoren:
pixel= new unsigned char*[dimy-1]; for (int i=0; i<dimy; i++) pixel[i]=new unsigned char[dimx-1];
und in meinen destruktoren steht folgendes:
for(int i = 0; i < dimy-1; i++) delete [] pixel[i]; delete [] pixel;
jetzt kriege ich immer zur laufzeit meines programms den fehler "heap corruption detected: after normal block (#1279)....", wenn der destruktor aufgerufen wird.
kann mir vielleicht jemand sagen warum dieser fehler auftritt und wie man dieses problem umgehen könnte?
vielen dank im voraus
-
musst/kannst du nicht die beiden for-schleifen weglassen?
-
hmm nee brauche leider ein char**-array für eine vorgebebene funktion (testat für ne vorlesung)
oder gibt es noch eine andere möglichkeit solch ein array zu erzeugen ohne die for-schleife?
-
for(int i = 0; i < dimx-1; i++) delete [] pixel[i]; delete [] pixel;
-
??????
-
Dein erstes Feld von char* scheint zu klein zu sein, da <dimy-1> ... danach erzeugst du aber <dimy> elemente ... also eines zuviel ... jetzt ist die Frage wo der Zeiger hingeschrieben wird ... anscheinened in ein anderes array ... wobei du z.B. versuchst zweimal den selben Zeiger zu löschen oder ähnliches ... evtl. macht auch der Code zwischen Konstruktor/Destruktor Probleme
pixel= new unsigned char*[dimy]; for (int i=0; i<dimy; i++) pixel[i]=new unsigned char[dimx]; ... for(int i = 0; i < dimy; i++) delete [] pixel[i]; delete [] pixel;
- Feyd
-
ja das mit dem dimy-1 und dimy macht keinen unterschied. habe da gerade getestet ob mein zu löschendes feld zu groß ist bzw. ob ich mehr löschen will als ich löschen darf. in beiden fällen kriege ich diesen fehler
mein zeiger char** wird zwar an eine funktion übergeben, diese schreibt aber nur die werte aus dem array in eine datei (bitmap)
jedoch verstehe ich das mit dem doppelten löschen nicht..könntest du das näher ausführen?
mein code zwischendrin ist eigentlich recht simpel. es werden einfach nur neue (also verschiedene) arrays erstellt, in welche irgendwelche werte geschrieben werden. dabei hätte sich bestimmt der compiler gemeldet wenn ich irgendwie über den allokierten seicherplatz geschrieben hätte
-
Das ist relativ einfach.
Dein Programm hat den sogenannten Heap. In diesem werden alle allokierten Speicherblöcke verwaltet. Wenn du einen Speicherblock löscht wird dieser in der Liste ausgetragen. Falls dieser schon nicht mehr in der Liste steht wird gerne mal ein "Heap destruction detected" (im Debug Build) ausgeworfen.Probleme können schnell entstehen wenn du DLL's verwendest, da diese gerne mal einen eigenen Heap verwenden und du somit keine Speicherblöcke, die von der DLL erzeugt worden sind, löschen kannst weil sie nicht in deinem Heap sind. Dieses erzeugt dann ein Memory Leak welches mehr oder weniger schnell die kompletten Systemresourcen frisst.
Ach da kann ich noch viel erzählen..
Aber ich denke das der Code zwischen Konstruktor/Destruktor jetzt so ein ähnliches Problem hat wie dieser vorher. Das du zu viele Elemente des Array setzt aber das Array diese nicht aufnehmen kann.
Ich weiss nicht ob du eine Applikation mit mehreren Threads erstellt hast aber evtl. macht ein anderer Thread dieses Problem.
Um sicher zu gehen würde ich das ganze einfach voll im Debug Build erstellen und das Debuggen direkt starten. Dann einfach auf "Programm weiter ausführen" gehen. Und spätestens an der Stelle sollte sich dein Debugger melden an der die Heap-Inkonsistenz auftritt. Jetzt brauchst du bloss noch die Aufrufe zurückverfolgen.
Ich hoffe ich konnte helfen
- Feyd