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...


Anmelden zum Antworten