Fehler beim delete[] eines n-dimensionalen Arrays
-
Es wird die Methode CIni::Release() aufgerufen. An der markierten Stelle kommt eine Speicherverletzung:
CIni::Release(){ // release langList langList *pCurLang = NULL, *pLastLang = NULL; while(pCurLang = m_pFirstLang){ while(pCurLang->pNext){ pLastLang = pCurLang; pCurLang = pCurLang->pNext; } if(pCurLang->cPath){ delete[] pCurLang->cPath; for(int i = 0; i < _NUMBER_OF_STRINGS; i++) delete[] pCurLang->cString[i]; // FEHLER if(pCurLang->hIcon) DeleteObject(pCurLang->hIcon); } if(pLastLang){ delete[] pLastLang->pNext; pLastLang = pLastLang->pNext = NULL; } else{ delete[] pCurLang; pCurLang = m_pFirstLang = NULL; } } }
Dabei hat die Struktur, die freigegeben werden soll, folgende Werte im Speicher zum Zeitpunkt des Absturzes:
Name: Wert: Typ: pCurLang 0x00a85288 _lang_list * (eigene Struktur) pCurLang->cPath 0x00a85550 "îþîþîþîþîþîþîþîþîþ[...]" char * pCurLang->cString 0x00a8528c char * [6] pCurLang->cString[0] 0x00a85598 "Sprache des Programms" char * pCurLang->cString[1] 0x00a855e0 "Sprache des Clients" char * pCurLang->cString[2] 0x00a85628 "Typ des Clients" char * pCurLang->cString[3] 0x00a85670 "Standard Client" char * pCurLang->cString[4] 0x00a856b8 "Speichern" char * pCurLang->cString[5] 0x00a85700 "Abbruch" char * pCurLang->Icon 0xa8050672 HBITMAP__ * pCurLang->pNext 0x00000000 _lang_list *
Ich habe versucht, das Problem nachzuvollziehen, stehe aber irgendwie auf dem Schlauch. In allen meinen Teilprogrammen, die die gleiche Struktur angelegt hatten, ging das Löschen ohne Probleme.
Angelegt und eigenelesen, werden die Teilstrings so:
for(int i = 0; i < _NUMBER_OF_STRINGS; i++){ //[...] pCur->cString[i] = new char[(int)sizeof(cBufString)+1]; strcpy(pCur->cString[i], cBufString); }
-
Also ich könnt mich köpfen........ 9 Stunden häng ich jetzt dadran und dann sowas...
for(int i = 0; i < _NUMBER_OF_STRINGS; i++){ //[...] pCur->cString[i] = new char[(int)sizeof(cBufString)+1]; strcpy(pCur->cString[i], cBufString); }
das muss natürlich:
for(int i = 0; i < _NUMBER_OF_STRINGS; i++){ //[...] pCur->cString[i] = new char[strlen(cBufString)+1]; // STRLEN! strcpy(pCur->cString[i], cBufString); }
heißen... oh man... wieder der typische Fehler: zuwenig speicher allokiert und dann in den nomansland-Bereich reingekommen...