2010-11-22 13 views
3

I Speicherlecks auftreten werde, während der folgenden GDI-Code ausgeführt wird:GDI Leak Problem

HDC hdcScreen = GetDC(NULL); 
HDC hdcMem = CreateCompatibleDC(hdcScreen); 
HBITMAP hbmpOld = (HBITMAP) SelectObject(hdcMem, hBmp); // apparently here is the leak 

// do something 

SelectObject(hdcMem, hbmpOld); //placing the old object back. The return object is handled elseware 
DeleteDC(hdcMem); // after CreateCompatibleDC 
ReleaseDC(NULL, hdcScreen); // after GetDC 

Ich sah schon bei ähnlichen Themen, wie this aber ich konnte nicht das Problem finden. Jede Hilfe wäre willkommen.

DeleteDC, Der Rückgabewert von ReleaseDC wurde auf "true" (keine Fehler) überprüft.

Danke, Tal.

+4

woran denkst du, dass da ein gdi-leak ist? Der Taskmanager hat eine Spalte, die die Anzahl der von einem Prozess zugewiesenen GDI-Handles anzeigt. Wird der Code erhöht, wenn dieser Code in einer Schleife ausgeführt wird? –

+1

Wo löschst du 'hBmp'? –

+3

Dieser Code leckt nicht, es ist woanders. –

Antwort

4

Gelöst. Das Problem war, dass hBmp nicht korrekt initialisiert wurde, so dass es zu einem Absturz am SelectObject kam - kein Fehler, nur die Funktion beendet, das "// tu etwas" und den Release-Teil übersprungen.

+3

Ich bin froh, dass du es herausgefunden hast. Für zukünftige Probleme ist dies ein gutes Beispiel dafür, warum Sie so viel Code wie möglich veröffentlichen müssen *. Ich arbeite weiter an meinen psychischen Debugging-Fähigkeiten, aber es besteht keine sehr gute Chance, dass irgendjemand einen Fehler im Code entdecken kann, den wir nicht sehen können! –

0

Für zukünftige Referenz ist ein sehr nützliches kostenloses Tool NirSoft GDIView, die GDI-Nutzung pro Prozess anzeigt und Änderungen verfolgt (Lecks behandeln), während es ausgeführt wird. So können Sie Vorgänge in Ihrer App ausführen und GDiview so lange prüfen, bis der Zähler ansteigt. Wiederholen Sie die Vorgänge dann so lange, bis Sie feststellen, welche die ungerechtfertigte Erhöhung des Zugriffszeichens verursacht.