Speicher freigeben mit delete[], wie gehts richtig?



  • void CArchiveCreatorDlg::CorrectBitmapSize()
    {
    	//Bitmapgröße wird auf ein Vielfaches von 512Byte korrigiert, Leerstellen am Ende werden mit Null aufgefüllt
    	int multiplikator;
    	DWORD k;
    	[b]char* p_BitmapCorrectSize;[/b]
    
    	multiplikator = m_FileSize / 512;
    	multiplikator++;
    
    	m_CorrectFileSize = multiplikator * 512;
    
    	//dynamisch Speicherplatz reservieren
    	[b]p_BitmapCorrectSize = new CHAR[m_CorrectFileSize];[/b]
    
    	p_BitmapCorrectSize = p_Bitmap;
    
    	//rest der stellen (correctFileSize - FileSize) mit NULL auffüllen
    	for(k=m_FileSize; k<=m_CorrectFileSize; k++)
    	{
    		p_BitmapCorrectSize[k] = NULL;//0;
    	};
    
    	p_Bitmap = new CHAR[m_CorrectFileSize];
    	p_Bitmap = p_BitmapCorrectSize;
    	[b]delete[] p_BitmapCorrectSize;[/b]
    }
    

    Hallo,
    wie im Code zu sehen habe ich dynamisch Speicherplatz für char* p_BitmapCorrectSize angelegt, am Ende der Funktion möchte ich diesen mit delete[] wieder freigeben. Warum bekomme ich die Fehlermeldung: "Debug Error! DAMAGE: after ..."?

    Mir geht es nur um die Speicherfreigabe, bitte keine Kommentare zum Sinn oder Unsinn der Funktion 😃

    Bergziege



  • char* p_BitmapCorrectSize;
    
    p_BitmapCorrectSize = new CHAR[m_CorrectFileSize];
    //p_BitmapCorrectSize zeigt auf korrekten Speicher
    
    p_BitmapCorrectSize = p_Bitmap;
    //p_BitmapCorrectSize zeigt nun auf p_Bitmap
    //Eben Allocierter Speicher ist verloren
    
    p_Bitmap = new CHAR[m_CorrectFileSize];
    //p_BitMap (und damit auch p_BitmapCorrectSize) haben wieder Speicher
    p_Bitmap = p_BitmapCorrectSize;
    //pBitmap (und p_BitmapCorrectSize) zeigen nun auf p_BitmapCorrectSize
    //pBitmap -> p_BitmapCorrectSize -> pBitmap -> p_BitmapCorrectSize
    //"Es ist ein Teufelskreis"
    
    delete[] p_BitmapCorrectSize;
    //Zeigt auf pBitmap wo kein ültiger Speicher ist !!!
    


  • Danke.

    Bin jetzt um eine Erfahrung reicher. Habe mein Fehler gefunden. 🙂

    Bye



  • Bergziege_82 schrieb:

    for(k=m_FileSize; k<=m_CorrectFileSize; k++)
    

    Hier schreibst du über das Ende des allozierten Blockes hinweg. Ändere den Vergleichsoperator in der Bedingung in <

    p_Bitmap = new CHAR[m_CorrectFileSize];
    	p_Bitmap = p_BitmapCorrectSize;
    	delete[] p_BitmapCorrectSize;
    }
    

    Du reservierst Speicher für p_Bitmap, läßt p_Bitmap danach aber auf p_BitmapCorrectSize zeigen. Damit ist der gerade reservierte Speicher verloren, du wirst ihn niemal freigeben können (Speicherleck.) Wie ich grad sehe machst du das vor der for-Schleife auch schon. Das solltest du abstellen.


Anmelden zum Antworten