タスク マネージャーでプロセスの 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 です。