2010-11-22 73 views
3

我遇到了内存泄漏,同时运行下面的代码GDI:GDI泄漏问题

HDC hdcScreen = GetDC(NULL); 
HDC hdcMem = CreateCompatibleDC(hdcScreen); 
HBITMAP hbmpOld = (HBITMAP) SelectObject(hdcMem, hBmp); // apparently here is the leak 

// do something 

SelectObject(hdcMem, hbmpOld); //placing the old object back. The return object is handled elseware 
DeleteDC(hdcMem); // after CreateCompatibleDC 
ReleaseDC(NULL, hdcScreen); // after GetDC 

我已经看了类似的主题,如this,但我无法找到问题。 任何帮助,将不胜感激。

DeleteDC,ReleaseDC返回值被检查为true(无错误)。

谢谢, Tal。

+4

是什么让你觉得那里有一个gdi泄漏? Taskmanager有一列显示进程分配的GDI句柄的数量。如果此代码在循环中运行,计数会增加吗? – 2010-11-22 12:47:25

+1

你在哪里删除'hBmp'? – 2010-11-22 13:07:17

+3

此代码不泄漏,它在别处。 – 2010-11-22 14:01:17

回答

4

已解决。 问题是hBmp没有正确初始化,所以SelectObject发生崩溃 - 没有错误,只是退出函数,跳过了“// do something”和发布部分。

+3

我很高兴你明白了。对于未来的问题,这是一个很好的例子,说明为什么您需要尽可能多地发布*代码。我继续研究我的心理调试技巧,但是我们没有很好的机会发现我们看不到的代码错误! – 2010-11-23 14:31:11

0

为了将来的参考,一个非常有用的免费工具是NirSoft GDIView,它显示每个进程的GDI使用情况并在运行时跟踪更改(处理泄漏)。因此,您可以在您的应用中执行操作并持续检查GDIView,直到您看到计数器增加为止,然后重复这些操作直到找出哪一个导致无用的句柄增加。