gdi控制策略?無意間打開任務管理器查看程序GDI對象計數,發現程序每次最小化然後最大化後,GDI對象增1,說明GDI資源存在洩漏,接下來我們就來聊聊關于gdi控制策略?以下内容大家不妨參考一二希望能幫到您!
無意間打開任務管理器查看程序GDI對象計數,發現程序每次最小化然後最大化後,GDI對象增1,說明GDI資源存在洩漏。
GDI資源洩漏就像牙疼一樣,平時沒什麼感覺,最後發作的時候,可是要人命的。随着程序長時間運行,GDI資源慢慢洩漏,主要特征為任務管理器中的GDI對象計數不斷增加,最後系統不堪重負,程序運行緩慢,直至最後崩潰。
開始診斷1) 使用GDI資源洩漏工具GDIndicator,打開目标程序,列表中會顯示程序使用的各項GDI資源計數。
2) 随着程序運行,刷新列表,可以觀察到目标程序的GDI資源計數是否一直增加。
3) 觀察到Brush對象遞增,說明畫刷對象存在洩漏。
GDIndicator工具僅給出初級的診斷,很難找到具體洩漏的代碼點。下面Deleaker登場。
需要說明的是,Deleaker是收費工具,可以提供14天的免費試用。
載入目标程序并啟動調試,運行程序一段時間後,退出程序,Deleaker會給出完整洩漏報告。
根據Deleaker給出的洩漏堆棧,成功定位洩漏點。
代碼解析考察以下CEdit類的反射代碼,其主要作用為修改控件背景色。
每次控件重繪都調用CtlColor,都會創建新的畫刷對象。
知道原因了,問題就容易解決了。
修正步驟如下首先定義類成員m_brBackground。
在類對象的構造函數中實例化畫刷對象:
修正後的CtlColor函數如下:
m_brBackground需要在類對象析構時釋放:
結論C 程序需要謹慎處理各類資源的釋放工作。相對于内存洩漏,GDI資源洩漏則更加難以診斷。
以下給出通用原則:
設備上下文:
CDC * pDC = GetDC();
ReleaseDC(pDC);
各類GDI對象,包括:畫筆,畫刷,字體,位圖,區域等。
CGDIObject * pGdiObject = CreateXXXObject();
pGdiObject->DeleteObject();
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!