我發現,在FillRgn()Windows GDI API函數之後,此函數中使用的GDI對象以某種方式「卡住」在內部系統映射的某個位置,並且不會被正確刪除:調用對象的DeleteObject()成功返回,但該進程的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);
SelectObject(g_DC, GetStockObject(WHITE_BRUSH));
int rs = DeleteObject(h);
if (!rs)
throw;
int after = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS);
}
該代碼演示了刪除HBRUSH句柄變量'before'和'after'後相等; g_DC是HDC的主窗口。
如何刪除'h',使GDI對象的數量遞減?
您正在泄漏該區域句柄。這可能是你正在觀察的泄漏?你用'h'做的事對我來說看起來不錯;實際上,'SelectObject'調用是多餘的,因爲你從未真正將你的畫筆選入'g_DC'。 –
我忘記提及考慮的資源是HBRUSH。是的,該區域不會被刪除,但是測試代碼的重點在於,刪除HBRUSH後,GDI對象的數量不會減少,因爲我認爲它應該。 –
正如[本文](http://msdn.microsoft.com/en-us/magazine/cc301756.aspx)中所述,GDI緩存純色畫筆。你看到的是刷子被邏輯刪除,但仍然物理存在於緩存中。 –