2
我試圖在用C編寫的應用程序中運行Windows CE 6.0中的內存泄漏的底部。我懷疑這個問題可能與處理窗口的繪畫事件有關。在僞代碼中,它看起來像這樣。在Windows中創建和使用字體/避免內存泄漏GDI
LRESULT CALLBACK HandlePaint(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint (hWnd, &ps);
HFONT logfont;
FONTINFO font1, font2;
memset(&logfont, 0, sizeof(LOGFONT));
//set font options for font1.
font1 = CreateFontIndirect(&logfont);
memset(&logfont, 0, sizeof(LOGFONT));
//set font options for font2.
font2 = CreateFontIndirect(&logfont);
for(int i = 0; i <= SOME_NUMBER; i++)
{
DrawStuff(hdc, font1);
DrawStuff(hdc, font2);
}
EndPaint (hWnd, &ps);
}
INT DrawStuff(HDC hdc, HFONT font)
{
HPEN pen = CreatePen(PS_SOLID, borderWidth, bordercolor);
HBRUSH brush = CreateSolidBrush(backcolor);
SelectObject (hdc, pen);
SelectObject (hdc, brush);
SelectObject(hdc, font);
SetTextColor (hdc, forecolor);
SetBkColor (hdc, backcolor);
DrawText (hdc, pChar, wcslen(pChar), prect, DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX);
DeleteObject(font);
DeleteObject(brush);
DeleteObject(pen);
}
我注意到在我見過的Windows圖形,有似乎是最grapics對象模式的例子:
HBRUSH brush = CreateBrush();
SelectObject(hdc, brush);
// use brush
DeleteObject(brush);
然而,正如你可以看到的例子上面有字體,每個字體都被創建一次,然後多次選擇/刪除。我不確定這會產生什麼影響。有沒有理由懷疑這裏有內存泄漏?
謝謝!
作爲一個原則問題,我不喜歡'DrawStuff'內的'DeleteObject(font)'。負責創建字體的例程也應該負責刪除它......並且在循環中調用「銷燬」看起來很奇怪。 – pmg 2011-06-06 19:11:23