2011-06-06 53 views
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); 

然而,正如你可以看到的例子上面有字體,每個字體都被創建一次,然後多次選擇/刪除。我不確定這會產生什麼影響。有沒有理由懷疑這裏有內存泄漏?

謝謝!

+3

作爲一個原則問題,我不喜歡'DrawStuff'內的'DeleteObject(font)'。負責創建字體的例程也應該負責刪除它......並且在循環中調用「銷燬」看起來很奇怪。 – pmg 2011-06-06 19:11:23

回答

5

我同意@ pmg的評論,表單的創建者應該是字體的驅逐者,而不是DrawStuff被調用者。

還要記住的是選擇對象返回直流原始項目,你應該總是返回,當你做到這一點的對象,如:

HPEN newPen = CreatePen(...); 
HPEN oldPen = SelectObject(hdc, newPen); 

// do stuff 

// clean up 
SelectObject(hdc, oldPen); // <-- note this line 
DeleteObject(newPen);