2010-11-22 36 views
3

Je rencontre des fuites de mémoire lors de l'exécution du code GDI suivant:fuite GDI problème

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 

je l'ai déjà regardé des fils similaires, tels que this mais je ne pouvais pas trouver le problème. Toute aide serait appréciée.

La valeur de retour DeleteDC, ReleaseDC a été vérifiée comme étant vraie (aucune erreur).

Merci, Tal.

+4

Qu'est-ce qui vous fait penser qu'il y a une fuite de GDI? Taskmanager a une colonne qui indique le nombre de handles GDI alloués par un processus. Est-ce que le compte augmente si ce code est exécuté dans une boucle? –

+1

Où supprimez-vous 'hBmp'? –

+3

Ce code ne fuit pas, il est ailleurs. –

Répondre

4

Résolu. Le problème était que hBmp n'était pas correctement initialisé, donc il y a eu un crash sur le SelectObject - pas d'erreur, juste la sortie de la fonction, en sautant le "// faire quelque chose" et la partie des releases.

+3

Je suis content que vous l'ayez compris. Pour les problèmes futurs, voici un bon exemple de la raison pour laquelle vous devez publier * le plus de code possible *. Je continue à travailler sur mes compétences de débogage psychique, mais il n'y a pas de chance que l'un de nous puisse attraper une erreur dans le code que nous ne pouvons pas voir! –

0

Pour référence future, un outil gratuit très utile est NirSoft GDIView qui affiche l'utilisation de GDI par processus et suit les changements (gérer les fuites) pendant son exécution. Vous pouvez donc effectuer des opérations dans votre application et continuer à vérifier GDIView jusqu'à ce que vous voyiez le compteur augmenter, puis répéter les opérations jusqu'à ce que vous identifiez celui qui provoque l'augmentation injustifiée de la poignée.