繁体   English   中英

创建和使用 fonts / 避免 windows GDI 中的 memory 泄漏

[英]Creating and using fonts / avoiding memory leaks in windows GDI

我试图在用 C 编写并在 Windows CE 6.0 上运行的应用程序中找出 memory 泄漏的底部。 我怀疑这个问题可能与 window 的绘制事件的处理有关。 在伪代码中它看起来像这样。

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 图形的示例中,大多数图形对象似乎都有一种模式:

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

但是,正如您在上面的 fonts 示例中看到的那样,每种字体都创建一次,然后多次选择/删除。 我不确定这样做有什么影响。 是否有理由怀疑 memory 泄漏?

谢谢!

我同意@pmg 的评论,即表单的创建者应该是字体的破坏者,而不是 DrawStuff 被调用者。

另请记住,SelectObject 返回 DC 中的原始项目,完成后您应该始终返回 object,例如:

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

// do stuff

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM