我注意到使用任务管理器,下面的代码中有一个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()); 

(顺便说一句在代码中HDC通过的GetDC返回不会被释放。)

其他提示

请确保您拨打ReleaseDC把手上未DeleteDCGetDC返回。

我可以建议deleaker寻找和修复泄漏。

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

我不认为()在第一行由GetDC所创建的直流被释放。

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

MFC具有各种GDI相关的对象,例如CDC和CMemoryDC等。当它们不再需要它们将执行正确的缺失。

读取彼佐尔德。 的GetDC()是真正的基

在最后一行,则不应被删除hOldObj

DeleteObject的(hOldObj);

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top