當我在任務管理器中查看我的進程的GDI對象數時,我發現並非每個GDI對象函數DeleteObject()的調用都會導致此數字遞減,該函數調用不會返回FALSE(因爲它應該在對象刪除不成功的情況下)。我使用普通的Windows API GDI函數,沒有額外的庫和包裝器,如MFC。爲什麼會出現這種情況,這是否意味着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);
}
變量「之前」和「之後」是相等的。 g_DC是主窗口的HDC。
請提供一個SSCCE –
標準的錯誤仍然是在設備上下文中選擇對象。是的,這是一個泄漏。 –
在這種情況下,DeleteObject()不應該返回零嗎?刪除對象的MSDN:「如果指定的句柄無效或當前選擇到DC中,則返回值爲零。」 –