-1

タスク マネージャーでプロセスの GDI オブジェクトの数を調べると、GDI オブジェクトの関数 DeleteObject() を呼び出すたびにこの数が減少するわけではなく、関数呼び出しが FALSE を返さないことがわかります (本来ならオブジェクトの削除に失敗した場合)。MFC などの追加のライブラリやラッパーを使用せずに、プレーンな Windows API GDI 関数を使用しています。なぜそのような状況が発生する可能性があり、それは 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);
}

変数 'before' と 'after' は等しいです。g_DC は、メイン ウィンドウの HDC です。

4

2 に答える 2

1

ストック GDI オブジェクトが作成または破棄されることはありません。これらは Windows によって管理されており、必要に応じて使用できます。次のようなコードがある場合

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

GDI カウントが上下することはありません。オブジェクトが実際には削除されていなくても、への呼び出しDeleteObjectは返されます。TRUE

リソース リークをチェックしたい場合GetGuiResourcesは、コード内に を呼び出して、前後の値を比較できます。通常、これらの呼び出しは、リソース カウントが一致する必要がある場所、つまりリソー​​スの作成と破棄が一致する場所に配置します。

于 2013-08-26T16:44:55.017 に答える