Создание и использование шрифтов / предотвращение утечек памяти в Windows GDI - PullRequest
2 голосов
/ 06 июня 2011

Я пытаюсь докопаться до утечки памяти в приложении, написанном на C и работающем в Windows CE 6.0. Я подозреваю, что проблема МОЖЕТ быть связана с обработкой события рисования окна. В псевдокоде это выглядит так.

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);
}

В примерах, которые я видел для оконной графики, я заметил, что для большинства графических объектов, по-видимому, существует шаблон:

HBRUSH brush = CreateBrush();
SelectObject(hdc, brush);
// use brush
DeleteObject(brush);

Однако, как вы можете видеть в приведенном выше примере со шрифтами, каждый шрифт создается один раз, а затем выбирается / удаляется несколько раз. Я не уверен, что это значит. Будет ли здесь причина подозревать утечку памяти?

Спасибо!

1 Ответ

5 голосов
/ 06 июня 2011

Я согласен с комментарием @ pmg о том, что создатель Формы должен быть разрушителем шрифта, а не вызываемого DrawStuff.

Также имейте в виду, что SelectObject возвращает исходный элемент в DC, и вы всегда должны возвращать этот объект, когда закончите, например:

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

// do stuff

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