GDI泄漏问题

时间:2009-01-27 01:47:23

标签: c winapi gdi

我注意到使用任务管理器,以下代码中有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

7 个答案:

答案 0 :(得分:5)

从评论中复制,我没有把它作为答案,因为我无法测试它,我不确定它是否正确,请测试它。

一般情况下,嵌套调用即

并不是一个好主意
HDC hDC1 = GetDC(); 
HDC hDC2 = CreateCompatibleDC(hDC1); 
.. 

而不是

HDC hDC = CreateCompatibleDC(GetDC()); 

(在您的代码中BTW,GetDC返回的HDC未发布。)

答案 1 :(得分:4)

请确保在ReleaseDC返回的句柄上致电DeleteDC而不是GetDC

答案 2 :(得分:1)

我可以建议删除者找到并修复泄漏。

答案 3 :(得分:0)

(当我注意到答案已经有了评论时,我就要说这个了 - 信用额去xhantt)

我不认为GetDC()在第一行创建的dc已经发布。

答案 4 :(得分:0)

我想这个问题已经回答了。我想跳入并推荐可用于GDI对象的各种智能指针类和包装器。

MFC具有各种GDI相关对象,如CDC和CMemoryDC等。当不再需要时,他们将执行正确的删除。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

您不应该在最后一行删除hOldObj

DeleteObject(hOldObj);