-1

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

4

2 回答 2

1

Stock GDI 对象永远不会被创建或销毁。它们由 Windows 维护,您可以随意使用它们。如果您有如下代码

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

您不会看到 GDI 计数上升或下降。即使对象没有真正删除,对的调用DeleteObject也会返回。TRUE

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

于 2013-08-26T16:44:55.017 回答
0

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

例子:

SelectObject(g_DC, GetStockObject(NULL_BRUSH)); 删除对象(h);

于 2017-08-02T12:27:17.237 回答