gdi控制策略(记一次GDI对象泄漏经历)

 2024-03-24  阅读 566  评论 0

摘要:无意间打开任务管理器查看程序GDI对象计数,发现程序每次最小化然后最大化后,GDI对象增1,说明GDI资源存在泄漏,接下来我们就来聊聊关于gdi控制策略?以下内容大家不妨参考一二希望能帮到您!gdi控制策略问题无意间打开任务管理器查看程序GDI对象计数,发现程序每次最小化然后最大化后,GDI对象增1

无意间打开任务管理器查看程序GDI对象计数,发现程序每次最小化然后最大化后,GDI对象增1,说明GDI资源存在泄漏,接下来我们就来聊聊关于gdi控制策略?以下内容大家不妨参考一二希望能帮到您!

gdi控制策略(记一次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();

版权声明:xxxxxxxxx;

原文链接:http://cn.tdroid.net/ce19dCz0DCgsMVw.html

发表评论:

管理员

  • 内容267226
  • 积分0
  • 金币0
关于我们
lecms主程序为免费提供使用,使用者不得将本系统应用于任何形式的非法用途,由此产生的一切法律风险,需由使用者自行承担,与本站和开发者无关。一旦使用lecms,表示您即承认您已阅读、理解并同意受此条款的约束,并遵守所有相应法律和法规。
联系方式
电话:
地址:广东省中山市
Email:
注册登录
注册帐号
登录帐号

Copyright © 2022 太卓开发网 Inc. 保留所有权利。 泰达科技网易库网

页面耗时0.1063秒, 内存占用1.33 MB, 访问数据库18次