Anfängerfrage zu MEMORY LEAKS DETECTED
-
Hallo,
ich bin mir zwar sicher, dass mein Problem schon mal aufgetaucht ist, weiss aber nicht, nach welchen Stichworten ich suchen soll.
Mein Anfänger-Programm ist voller Memory-Leaks, die ich ausmerzen muss. Bei der Fehlersuche bin ich darauf gekommen, dass schon die einfache Funktion
void CreateD3DFont(void) { D3DXFONT_DESC FontDesc = { 0 }; strcpy(FontDesc.FaceName, "Arial"); FontDesc.Height = 60; D3DXCreateFontIndirect(lpD3DDevice, &FontDesc, &lpD3DFont); }"4 allocations unfreed" auslöst und einen automatischen Breakpoint hervorruft. Vermutlich muss ich einfach das FontDesc am Ende der Funktion wieder löschen?! - Wenn ja: Wie? Bei euch im Forum habe ich schon DeleteObject gefunden, in meinen Büchern steht delete, auch delete[] oder = NULL habe ich ausprobiert, - aber es funktioniert einfach nicht.
Ich bitte um eine kleine Hilfestellung und hoffe, das mit den Memory-Leaks dann gleich so zu verstehen, dass ich alle anderen auch gleich mit beheben kann.
Vielen Dank!
-
Objekte, die man mit new auf dem Heap anlegt, muss man mit delete wieder löschen.
Arrays wie new int[n] "löscht" man mit delete[]. Am besten ein kleines Konsolen-Beispiel hierfür:#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { unsigned n; // Anzahl Werte double s; // Summe int * pa; // Zeiger auf dynam. Array cout << "Wie viele Zufallswerte? "; cin >> n; // Erst zur Laufzeit ermittelt !!! pa = new int[n]; // dynamisches Array zur Laufzeit anfordern !!! srand( unsigned( time(0) ) ); for (int i=0; i<n; i++) { pa[i] = rand() % 99 + 1 ; // Zufallszahlen 1 ... 99 generieren //cout << pa[i] << ' '; } s = 0; for( unsigned i=0; i<n; ++i ) s += static_cast<double>( pa[i] ); cout << endl << "Mittelwert: " << s / n << endl; // Erwartung: 50.0 delete[] pa; // Speicher für dynamisches Array freigeben. pa = NULL; // Zur Sicherheit gelöschten Zeiger auf NULL setzen. }In Klassen erstellt man die Daten auf dem Heap z.B. im Konstruktor und löscht die erhaltenen Zeiger darauf z.B. im Destruktor oder einer ähnlichen Funktion (DestroyWindow, ...). Memory Leaks findest Du mit dem MSVC++ Debugger.
-
Danke für die schnelle Antwort!
Das klingt plausibel und schon halbwegs bekannt - aber ich habe gar kein "new" benutzt (im ganzen Programm nicht).
Die Funktion wird mit CreateD3DFont(); aufgerufen. Auch die Variablen sind z.B. mit
LPD3DXFONT lpD3DFont = NULL;deklariert. Ich weiss einfach nicht, was ich löschen soll. Wenn ich die Funktion und deren Aufruf aus dem Code herauslösche, sind keine Memory Leaks da. Ansonsten steht dort:
D3DX: MEMORY LEAKS DETECTED: 4 allocations unfreed (1051400 bytes) D3DX: Set HKLM\Software\Microsoft\Direct3D\D3DXBreakOnAllocId=0x1 to debug Das Programm "[3420] DirectXTest020.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.Wobei ich den Registry Key schon gesetzt habe - Effekt war aber ausschließlich, dass bei jedem Aufruf des Programms im Debug Modus die Meldung "DirectXTest020.exe hat einen Haltepunkt ausgelöst." erscheint - und zwar genau auf der } Klammer zu der Funktion.
Deinem Beispiel nach müsste ich doch so etwas wie
delete FontDesc;schreiben. Daran, dass das nicht funktioniert, sehe ich, dass ich wohl etwas falsch verstanden habe.
Wahrscheinlich machen meine nicht vorhandenen Gehirnwindungen gerade auf sich aufmerksam. Es hilft aber alles nichts, ich muss noch einmal nachfragen... Den dicken Holzhammer habe ich in den letzten paar Stunden schon einige male ausprobiert, - zum größten Teil mit Erfolg, aber in diesem Falle bisher noch nicht ...
-
if( lpD3DFont ) { lpD3DFont->Release(); lpD3DFont = 0; }Safe Release im Destructor
-
Das ist super - Danke!!! Ihr seid die Besten!

-
Hurra - meine Anwendung läuft jetzt wirklich länger als 30 Sekunden am Stück! - Ihr habt mir erstklassig weitergeholfen! Danke!