牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

GDI对象导致内存泄露

转载自:http://www.sizeof.cn/html/2010/382.html



最近在一个项目中,被测试组人员检测出来GDI对象导致内存泄露,之后,经过代码的走读,确实发现存在这样一个问题。

首先是现象,在一些项目中,如果发现图片,图标等突然显示不出来,就有可能是GDI对象已经满了,这个事情,用任务管理器,把GDI对象打开,就可以看到了,如果GDI对象迅速上涨,就基本可以确认是GDI对象导致内存泄露。

经过查证,发现以下代码会导致GDI对象上涨,内存泄露,因为以下代码会定时执行,每当一个执行周期一道,就会重新申请内存,导致泄露。

m_switch_http.SetIcon((HICON__*)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_OFF), 
        IMAGE_ICON, 
1616, LR_DEFAULTCOLOR));

正确的修改方法应该改为:
// 加载代码在初始化的时候完成,不能放在定时器里面
HICON h_off = (HICON__*)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_OFF), 
        IMAGE_ICON, 
1616, LR_DEFAULTCOLOR);
 
// 以下代码放在定时器里面执行
m_switch_http.SetIcon(h_off);

posted on 2011-03-09 17:24 杨粼波 阅读(948) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理