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.