【发布时间】:2013-08-26 15:53:33
【问题描述】:
当我在任务管理器中查看我的进程的 GDI 对象数量时,我发现并非每次调用 GDI 对象的函数 DeleteObject() 都会导致该数量减少,并且函数调用不会返回 FALSE (如果对象删除不成功,则应该这样做)。我使用的是普通的 Windows API GDI 函数,没有额外的库和包装器,例如 MFC。为什么会出现这种情况,是否意味着GDI资源泄漏?
这里是如何重现问题的代码:
void gditest()
{
HBRUSH h = CreateSolidBrush(RGB(255, 237, 5));
HRGN rgn = CreateRectRgn(0, 100, 100, 0);
FillRgn(g_DC, rgn, h);
int before = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS);
int rs = DeleteObject( h );
if ( !rs )
throw;
int after = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS);
}
变量“之前”和“之后”是相等的。 g_DC 是主窗口的 HDC。
【问题讨论】:
-
请提供SSCCE
-
标准错误仍然是在设备上下文中选择对象。是的,这是一个泄漏。
-
在这种情况下 DeleteObject() 不应该返回零吗? DeleteObject 的 MSDN:“如果指定的句柄无效或当前被选入 DC,则返回值为零。”
-
一个DC也是一个GDI对象,你是在调用
ReleaseDC同时删除画笔吗? -
每次调用GDI函数后是否需要释放DC?我在程序启动时为主窗口初始化了一个全局 DC 句柄,所有功能都只使用这个 DC。 (程序是单线程的。)