5185|11

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教高手:wince gdi资源泄露问题 [复制链接]

在wince下利用双内存图片控件实现图片循环显示,效果不错,但是内存不断增长,利用remote heap walker工具发现gdi资源泄露,程序在堆中循环生成fixed block,不释放。问题很严重啊。然而同样的代码在winxp下编译运行没有这种情况。

变量定义部分就不写了是mfc类对象,下边是释放的代码:
memDC.SelectObject(pOldBmp);//选入旧的位图
memDC.DeleteDC();//清除设备
memBitmap.DeleteObject();//删除位图
pDC->DeleteDC();//清除设备

最新回复

换成hdc句柄,强制释放资源,可以解决的  详情 回复 发表于 2009-5-17 11:29
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
如果你把 HBitmap 之类的对象定义成了类的成员变量 那么这个变量只会在类的析构函数调用时释放。
解决方法是把这个 HBitmap 之类的 GDI 对象定义为局部变量 在使用的时候临时加载,用完就释放
你上面的代码没问题
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
诚如xajhuang所说,我的gdi对象和dc设备都是在函数内部定义的局部变量。但是在ce下,堆不停的增长,都是fixed。不过程序关闭后,就没有泄露了。期待高手
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
肯定是LZ代码的问题,大家都在用MFC,如果GDI有问题,早就天下大乱了。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 91program 的回复:
肯定是LZ代码的问题,大家都在用MFC,如果GDI有问题,早就天下大乱了。



同意楼上的看法~
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
楼上两位说的有道理,但是同样的代码在vc下是不存在这样的问题。想把函数内部代码公布如下
程序循环调用此段代码,在图片控件中显示str字符串。///DrawText(str,rect,DT_CENTER);////////
让大家费心了       
     CRect rect;
         CFont m_memFont;        //字体
         CDC *pDC;             //屏幕绘图设备
         CDC memDC;            //内存绘图设备
       
         CBitmap memBitmap; //定义一个位图对象


         CBitmap* pOldBmp = NULL;

        m_memFont.CreatePointFont(800,L"MS Sans Serif",NULL);
                        CWnd* pWnd = GetDlgItem(IDC_SCREEN);// IDC_REC_DISPACCW
        pWnd->GetClientRect(&rect);
        pDC = pWnd->GetDC();//获取dc
        pDC->GetClipBox(&rect);
               
        memDC.CreateCompatibleDC(pDC);//
        memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
        pOldBmp = memDC.SelectObject(&memBitmap);//
        memDC.FillSolidRect(rect,RGB(0,0,0));//
        memDC.SetBkColor(RGB(0,0,0));
        memDC.SetTextColor(RGB(0,255,0));
        CFont *poldfont= memDC.SelectObject(&m_memFont);
        memDC.DrawText(str,rect,DT_CENTER);
        pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,& memDC,0,0,SRCCOPY);
         pWnd->ReleaseDC(pDC);       
         memDC.SelectObject(pOldBmp);
         memDC.SelectObject(poldfont);
         memDC.DeleteDC();//清除内存dc设备
        m_memFont.DeleteObject();
         memBitmap.DeleteObject();//清除内存位图
         pDC->DeleteDC();//清除dc设备
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
我曾经碰到和楼主同样的问题,不要用CDC做直接用HDC,然后一定要防止函数被重入.试试
祝楼主好运.
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢楼上的,看来mfc要慎用啊
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 Panghuang 的回复:
我曾经碰到和楼主同样的问题,不要用CDC做直接用HDC,然后一定要防止函数被重入.试试
祝楼主好运.


是有这个问题,是窗体的DC正常使用完后,不能释放,每次出现4字节的内存泄漏!

LZ上这个问题吗?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
恩,不是4字节,是4k。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
我也用了HDC,但无效,还是放不掉,不知道楼上解决了没有,谢谢
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 
换成hdc句柄,强制释放资源,可以解决的
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表