GDI泄漏问题

3
我注意到使用任务管理器后发现以下代码存在GDI泄漏。每次执行此代码的进程中的GDI对象计数增加1,但我似乎找不到问题所在。
任何帮助都将不胜感激。
// create new DC based on current    
HDC hDC = CreateCompatibleDC(GetDC());
// select a bitmap into the new DC and keep the old one
HGDIOBJ hOldObj = SelectObject (hDC,hBM);
// do somthing here --> 100% no leak here
SomeFunction (hDC);
// select the old object back from whence it came and delete whats returned   
DeleteObject (SelectObject (hDC,hOldObj));
// delete the DC
DeleteDC(hDC);
// delete the tmp object
DeleteObject (hOldObj);

RM


通常嵌套调用不是一个好主意,例如: HDC hDC1 = GetDC(); HDC hDC2 = CreateCompatibleDC(hDC1); .. 而不是 HDC hDC = CreateCompatibleDC(GetDC()); (顺便说一下,在您的代码中,由GetDC返回的HDC没有被释放。) - Ismael
xhantt:那不是一个答案吗?删除评论并将其放入答案区域。 - jmucchiello
那么解决方法就是对getDC返回的内容进行ReleaseDC操作吗? 如果我理解正确,请在答案部分写下这个答案,以便我们投票。 - RomanM
顺便说一下,不要 DeleteObject(hOldObj)。那不是你的对象需要清理。你没创建它,所以不要删除它。 - Adrian McCarthy
你可以使用Valgrind或Deleaker。但是,Deleaker的名字已经说明了一切。 - John Smith
7个回答

6

从评论中复制过来,我没有将其作为答案,因为我无法测试它,也不确定它是否正确,请测试一下。

总的来说,嵌套调用并不是一个好主意,例如

HDC hDC1 = GetDC(); 
HDC hDC2 = CreateCompatibleDC(hDC1); 
.. 

替代

HDC hDC = CreateCompatibleDC(GetDC()); 

(顺便提一下,在您的代码中,由GetDC返回的HDC没有被释放。)

4
请确保在从GetDC返回的句柄上调用ReleaseDC而不是DeleteDC

1

我可以建议使用Deleaker来查找和修复泄漏问题。


0

我正要说这个问题,但是我注意到已经有一个带答案的评论了 - 感谢xhantt)

我认为在第一行使用GetDC()创建的dc没有被释放。


0

我猜这个问题已经有答案了。我想推荐一些可用于GDI对象的智能指针类和包装器。

MFC有各种与GDI相关的对象,如CDC、CMemoryDC等。当它们不再需要时,它们将执行正确的删除操作。


0

阅读Petzold。 GetDC()确实是基础。


0

在最后一行不应删除 hOldObj

DeleteObject(hOldObj);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接