最近在一个项目中,被测试组人员检测出来GDI对象导致内存泄露,之后,经过代码的走读,确实发现存在这样一个问题。
首先是现象,在一些项目中,如果发现图片,图标等突然显示不出来,就有可能是GDI对象已经满了,这个事情,用任务管理器,把GDI对象打开,就可以看到了,如果GDI对象迅速上涨,就基本可以确认是GDI对象导致内存泄露。
经过查证,发现以下代码会导致GDI对象上涨,内存泄露,因为以下代码会定时执行,每当一个执行周期一道,就会重新申请内存,导致泄露。
m_switch_http.SetIcon((HICON__*)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_OFF),
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);
时间: 2024-08-30 14:19:34