GDI对象导致内存泄露
最近在一个项目中,被测试组人员检测出来GDI对象导致内存泄露,之后,经过代码的走读,确实发现存在这样一个问题。
首先是现象,在一些项目中,如果发现图片,图标等突然显示不出来,就有可能是GDI对象已经满了,这个事情,用任务管理器,把GDI对象打开,就可以看到了,如果GDI对象迅速上涨,就基本可以确认是GDI对象导致内存泄露。
经过查证,发现以下代码会导致GDI对象上涨,内存泄露,因为以下代码会定时执行,每当一个执行周期一道,就会重新申请内存,导致泄露。
m_switch_http.SetIcon((HICON__
*
)::LoadImage(AfxGetApp()
->
m_hInstance, MAKEINTRESOURCE(IDI_OFF),
IMAGE_ICON, 16 , 16 , LR_DEFAULTCOLOR));
IMAGE_ICON, 16 , 16 , LR_DEFAULTCOLOR));
正确的修改方法应该改为:
//
加载代码在初始化的时候完成,不能放在定时器里面
HICON h_off = (HICON__ * )::LoadImage(AfxGetApp() -> m_hInstance, MAKEINTRESOURCE(IDI_OFF),
IMAGE_ICON, 16 , 16 , LR_DEFAULTCOLOR);
// 以下代码放在定时器里面执行
m_switch_http.SetIcon(h_off);
HICON h_off = (HICON__ * )::LoadImage(AfxGetApp() -> m_hInstance, MAKEINTRESOURCE(IDI_OFF),
IMAGE_ICON, 16 , 16 , LR_DEFAULTCOLOR);
// 以下代码放在定时器里面执行
m_switch_http.SetIcon(h_off);