删除GDI对象不会减少其数量

时间:2013-08-26 15:53:33

标签: c++ windows winapi gdi

当我在任务管理器中查看我的进程的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。

2 个答案:

答案 0 :(得分:1)

库存GDI对象永远不会被创建或销毁。它们由Windows维护,您可以根据需要使用它们。如果您有以下代码

HPEN hPen = (HPEN)GetStockObject(BLACK_PEN);
DeleteObject(hPen);

你不会看到GDI计数上升或下降。对DeleteObject的调用将返回TRUE,即使该对象未被真正删除。

如果要检查资源泄漏,可以在代码中调用GetGuiResources来比较之前/之后的值。您通常会将这些调用置于资源计数应匹配的位置,即资源的创建和销毁匹配。

答案 1 :(得分:0)

在删除对象之前,应该为设备上下文选择一个NULL对象。

示例:

SelectObject(g_DC,GetStockObject(NULL_BRUSH)); DeleteObject的(H);