VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 749|回复: 7

一段自绘按钮的代码,为什么会有内存泄露?

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-16 20:30:02 | 显示全部楼层 |阅读模式
每运行一次,内存就会增长12到16字节,请问错在哪儿?
代码:
void CShadowCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
        CDC * dc = GetDC() ;
        dcMemory.CreateCompatibleDC(dc);
        CRect rc;
        GetClientRect(&rc);

        CBitmap bmp;
        bmp.CreateCompatibleBitmap(dc,rc.Width(),rc.Height());
        dcMemory.SelectObject(&bmp);
       
        CBrush brush,*oldBrush;
        CPen pen,*oldPen;

        //draw BK
        brush.Detach();
        brush.CreateSolidBrush(m_bkColor);
        pen.Detach();
        pen.CreatePen(PS_SOLID,1,m_bkColor);
        oldBrush = dcMemory.SelectObject(&brush);
        oldPen = dcMemory.SelectObject(&pen);
        dcMemory.Rectangle(&rc);

        //Draw Text
        dcMemory.SelectObject(&m_textFont);
        CString strText;
        GetWindowText(strText);
        dcMemory.SetTextColor(m_textCurrColor);
        dcMemory.SetBkMode(TRANSPARENT);
        dcMemory.DrawText(strText,&rc,DT_CENTER | DT_VCENTER |DT_WORDBREAK);

        dc->BitBlt(0,0,rc.Width(),rc.Height(),&dcMemory,0,0,SRCCOPY);
        dcMemory.SelectObject(oldBrush);
        dcMemory.SelectObject(oldPen);
        brush.DeleteObject();
        pen.DeleteObject();
        bmp.DeleteTempMap();
        bmp.DeleteObject();
        dcMemory.DeleteDC();       
}
回复

使用道具 举报

0

主题

5

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-4-19 08:15:02 | 显示全部楼层
你用了
CDC * dc = GetDC() ;
你应该加上
ReleaseDC(dc);
你再试试吧,看有没有效果。
回复

使用道具 举报

0

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-4-19 12:45:01 | 显示全部楼层
内存泄露怎么回事我不知道
不过我重载这个函数时rcItem ,hwnd....都是通过lpDrawItemStruct得到的
回复

使用道具 举报

0

主题

5

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-4-19 22:00:01 | 显示全部楼层
内存泄露就是你申请暂用了内存但没有释放,特别是在ontimer 事件中,假设你一秒申请一次这样没有多久你的程序就该死了。
回复

使用道具 举报

0

主题

5

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-4-20 00:15:01 | 显示全部楼层
例如:
CPen*apen=new CPen;//申请暂用内存;
你就应该加上
delete apen;
如果不加上,这就是内存泄露了。
不知道这样说合不合理,我也是个菜鸟。
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-4-20 01:15:01 | 显示全部楼层
确实是DC的问题,谢谢
用了lpDrawItemStruct的DC就没问题了
回复

使用道具 举报

0

主题

5

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-4-20 11:15:01 | 显示全部楼层
解决问题就好,慢慢的进步,时间长了我们应该就会变得强一些了。
回复

使用道具 举报

0

主题

36

帖子

22.00

积分

新手上路

Rank: 1

积分
22.00
发表于 2020-4-23 20:00:01 | 显示全部楼层
you forget to restore old bmp and old font.
        CDC * dc = GetDC() ;
        dcMemory.CreateCompatibleDC(dc);
        CRect rc;
        GetClientRect(&rc);
       
        CBitmap bmp;
        bmp.CreateCompatibleBitmap(dc,rc.Width(),rc.Height());
        CBitmap* oldBmp = dcMemory.SelectObject(&bmp);
       
        CBrush brush,*oldBrush;
        CPen pen,*oldPen;
       
        //draw BK
//         brush.Detach();
        brush.CreateSolidBrush(m_bkColor);
//         pen.Detach();
        pen.CreatePen(PS_SOLID,1,m_bkColor);
        oldBrush = dcMemory.SelectObject(&brush);
        oldPen = dcMemory.SelectObject(&pen);
        dcMemory.Rectangle(&rc);
       
        //Draw Text
        CFont* oldFont = dcMemory.SelectObject(&m_textFont);
        CString strText;
        GetWindowText(strText);
        dcMemory.SetTextColor(m_textCurrColor);
        dcMemory.SetBkMode(TRANSPARENT);
        dcMemory.DrawText(strText,&rc,DT_CENTER | DT_VCENTER |DT_WORDBREAK);
       
        dc->BitBlt(0,0,rc.Width(),rc.Height(),&dcMemory,0,0,SRCCOPY);
        dcMemory.SelectObject(oldBrush);
        dcMemory.SelectObject(oldPen);
        dcMemory.SelectObject(oldFont);
        dcMemory.SelectObject(oldBmp);
        brush.DeleteObject();
        pen.DeleteObject();
//         bmp.DeleteTempMap();
        bmp.DeleteObject();
        dcMemory.DeleteDC();
        ReleaseDC(dc);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表