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);

R M

4

7 回答 7

6

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

一般来说,嵌套调用不是一个好主意,即

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

代替

HDC hDC = CreateCompatibleDC(GetDC()); 

(顺便说一句,在您的代码中,GetDC 返回的 HDC 未发布。)

于 2009-01-27T02:39:19.003 回答
4

确保您ReleaseDC不在DeleteDCGetDC.

于 2009-01-27T02:22:20.660 回答
1

我可以建议 deleaker 查找并修复泄漏。

于 2011-11-17T16:58:50.153 回答
0

(我正要说这个时,我注意到已经有答案的评论 - 归功于 xhantt)

我不认为 GetDC() 在第一行创建的 dc 被释放。

于 2009-01-27T02:16:55.430 回答
0

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

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

于 2009-01-27T04:56:59.380 回答
0

阅读 Petzold。GetDC() 是真正的基础。

于 2009-01-27T17:20:23.903 回答
0

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

DeleteObject (hOldObj);

于 2009-01-27T17:26:24.250 回答