最近在一個(gè)項(xiàng)目中,被測試組人員檢測出來GDI對象導(dǎo)致內(nèi)存泄露,之后,經(jīng)過代碼的走讀,確實(shí)發(fā)現(xiàn)存在這樣一個(gè)問題。
首先是現(xiàn)象,在一些項(xiàng)目中,如果發(fā)現(xiàn)圖片,圖標(biāo)等突然顯示不出來,就有可能是GDI對象已經(jīng)滿了,這個(gè)事情,用任務(wù)管理器,把GDI對象打開,就可以看到了,如果GDI對象迅速上漲,就基本可以確認(rèn)是GDI對象導(dǎo)致內(nèi)存泄露。
經(jīng)過查證,發(fā)現(xiàn)以下代碼會導(dǎo)致GDI對象上漲,內(nèi)存泄露,因?yàn)橐韵麓a會定時(shí)執(zhí)行,每當(dāng)一個(gè)執(zhí)行周期一道,就會重新申請內(nèi)存,導(dǎo)致泄露。
m_switch_http.SetIcon((HICON__*)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_OFF),
IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR));
正確的修改方法應(yīng)該改為:
// 加載代碼在初始化的時(shí)候完成,不能放在定時(shí)器里面
HICON h_off = (HICON__*)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_OFF),
IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
// 以下代碼放在定時(shí)器里面執(zhí)行
m_switch_http.SetIcon(h_off);