tft每日頭條

 > 圖文

 > gdi控制策略

gdi控制策略

圖文 更新时间:2024-11-10 00:51:14

gdi控制策略?無意間打開任務管理器查看程序GDI對象計數,發現程序每次最小化然後最大化後,GDI對象增1,說明GDI資源存在洩漏,接下來我們就來聊聊關于gdi控制策略?以下内容大家不妨參考一二希望能幫到您!

gdi控制策略(記一次GDI對象洩漏經曆)1

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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved