题
我注意到使用任务管理器,下面的代码中有一个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
把手上未DeleteDC
从GetDC
返回。
我可以建议deleaker寻找和修复泄漏。
(我正要说这个的时候,我注意到已经有最佳答案评论 - 归功于xhantt)
我不认为()在第一行由GetDC所创建的直流被释放。
我想这个问题已经回答了。我想跳,并推荐各种智能指针类和包装可用于GDI对象。
MFC具有各种GDI相关的对象,例如CDC和CMemoryDC等。当它们不再需要它们将执行正确的缺失。
读取彼佐尔德。 的GetDC()是真正的基
在最后一行,则不应被删除hOldObj
DeleteObject的(hOldObj);
不隶属于 StackOverflow