GDI對象泄漏問題排查總結

GDI泄漏會彈出CResourceException異常(問題復現調試時輸出信息發現的異常)。一個Windows GUI程序的GDI對象上限是10000,如果跨越這個值,GDI資源無法申請成功,程序就會出現資源無法加載,界面起不來的情況。

另外,GDI資源泄漏後,GDI對象值會一直遞增,最終到達上限10000後出現程序起不來。

一個簡單的辦法可以斷定gdi是否存在泄漏,就是在Windows任務管理器中進程(【查看】-》【選擇列】選上【GDI對象】)看裏面的該過程的GDI對象是否一向在增長。

GDI對象的上限是10000,基本上用完的情況比較少,但如果是週期性的申請+長時間的運行,最終會出現程序因資源申請失敗造成起不來的問題。

到了這一步基本可以定位到問題了,原因就是申請的GDI資源沒有釋放,接下來針對性的解決即可。

參考下圖的方法釋放;

--------------------- 
作者:法哥2012 
來源:CSDN 
原文:https://blog.csdn.net/shufac/article/details/82838604 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

 

我自己的遇到的問題是由於按鈕的類是自定義的,每次鼠標移動上去都會觸發focus的狀態重繪,裏面用到了CBrush,但是用完之後沒有deleteobject(),因此出現GDI泄漏,解決例子如下:

      CBrush br(RGB(0,0,0)); 
       CBrush* pOldBrush =pDC->SelectObject(&br);
    pDC->FrameRect(&itemRect, &br);
    itemRect.DeflateRect(1, 1);
     pDC->SelectObject(pOldBrush);  
  br.DeleteObject();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章