无意间打开任务管理器查看程序GDI对象计数,发现程序每次最小化然后最大化后,GDI对象增1,说明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;
工作时间:8:00-18:00
客服电话
电子邮件
扫码二维码
获取最新动态