首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BitBlt内存泄漏

BitBlt内存泄漏
EN

Stack Overflow用户
提问于 2015-06-25 13:56:54
回答 2查看 840关注 0票数 1

我使用BitBlt在我的按钮上显示位图。对于大多数情况下,这是好的,但有一个内存泄漏,导致程序崩溃一段时间后。我这是怎么了?

代码语言:javascript
复制
int Springboard::DrawBasicButtons(DRAWITEMSTRUCT* pdis, HINSTANCE hInstance){
    RECT rect;
    static HBITMAP hCurrIcon, hIconoff, hIconon;
    rect = pdis->rcItem;

    HFONT font = CreateFont(13, 0, 0, 0, 300, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L"Arial");
    TCHAR Txtstr[MAX_PATH];
    BOOL isText = FALSE;
    int textsize;

    if (IDC_HOLD == pdis->CtlID) {
        hIconoff = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(BASIC_HOLDOFF));
        hIconon = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(BASIC_HOLDON));
        _tcscpy( Txtstr, _T("Hold      "));
        isText = TRUE;
        if (pdis->itemState & ODS_SELECTED) hCurrIcon = hIconon;
        else hCurrIcon = hIconoff;
    }

    HDC hdc = CreateCompatibleDC(pdis->hDC);
    SelectObject(hdc, hCurrIcon);

    BitBlt(pdis->hDC,0, 0,ICON_WIDTH,ICON_HEIGHT, hdc, 0, 0, SRCCOPY);

    if(isText == TRUE){
        textsize = _tcslen(Txtstr);
        SetTextColor(pdis->hDC, RGB(230,230,230));
        HFONT hFontOld = (HFONT) SelectObject(pdis->hDC, font);
        DrawText(pdis->hDC, Txtstr, textsize, &pdis->rcItem, DT_SINGLELINE | DT_VCENTER | DT_RIGHT);
        SelectObject( pdis->hDC, hFontOld );
    }

    DeleteDC(hdc);
    DeleteBitmap(hCurrIcon);
    DeleteBitmap(hIconoff);
    DeleteBitmap(hIconon);
    font = NULL;

    return(RET_OK);
}
EN

回答 2

Stack Overflow用户

发布于 2017-01-23 10:55:00

在上面的示例中,您选择了一个对象~第21行、第22行:

代码语言:javascript
复制
   HDC hdc = CreateCompatibleDC(pdis->hDC);
                                  SelectObject(hdc, hCurrIcon);  // (*1)

之后,您选择了一个对象。

代码语言:javascript
复制
`(if (isText == TRUE))`

     HFONT hFontOld = (HFONT) SelectObject(pdis->hDC, font);
      DrawText(pdis->hDC, Txtstr, textsize, &pdis->rcItem, DT_SINGLELINE |  DT_VCENTER | DT_RIGHT);

并恢复了省长的身份。对象

代码语言:javascript
复制
    SelectObject( pdis->hDC, hFontOld );

但是您从未恢复过第一个SelectObject()

代码语言:javascript
复制
                                     see remark \*1 above You did not save the previous (default) object before.

马格努斯狼疮(c) 1993

票数 -1
EN

Stack Overflow用户

发布于 2020-06-02 02:53:11

试试这个:

移动打嗝=。打嗝= ..。在if语句的外部和上面。它们将在功能结束时以任何方式被删除。在修复bug之后,您可以找到优化。

一开始,打嗝和打嗝都不会被设置为任何东西。不要仅仅因为它们是静态数据就假定它们为null。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31052482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档