GDI泄漏排查经验零散总结
1.GDI对象以及释放方法:
GDI对象 |
产生方法 |
销毁方法 |
位图(HBITMAP) |
CreateBitmap,CreateBitmapIndirect, CreateCompatibleBitmap,CreateDIBitmap, CreateDIBSection,CreateDiscardableBitmap |
DeleteObject |
画刷(HBRUSH) |
CreateBrushIndirect,CreateDIBPatternBrush, CreateDIBPatternBrushPt,CreateHatchBrush, CreatePatternBrush,CreateSolidBrush |
DeleteObject |
设备上下文(HDC) |
CreateDC |
DeleteDC,ReleaseDC |
字体(HFONT) |
CreateFont,CreateFontIndirect |
DeleteObject |
内存DC(HDC) |
CreateCompatibleDC |
DeleteDC |
调色板(HPALETTE) |
CreatePalette |
DeleteObject |
画笔(HPEN) |
CreatePen,CreatePenIndirect |
DeleteObject |
区域(HRGN) |
CombineRgn,CreateEllipticRgn, CreateEllipticRgnIndirect,CreatePolygonRgn, CreatePolyPolygonRgn,CreateRectRgn, CreateRectRgnIndirect,CreateRoundRectRgn, |
DeleteObject |
2.资源切换时容易出现的GDI泄漏:
1)SelectObject、SetBitmap、SetIcon、SendMessage(消息为BM_Bitmap时),会返回之前使用的GDI资源,不再使用的GDI资源需要及时释放(记录好之前使用的系统GDI资源,在结束时还原设置并释放掉申请的GDI资源);
2)SelectObject 选入的用户创建的GDI资源,需要在不再使用时选出并释放。
3.LoadImage函数:
LoadImage函数可以加载Bitmap、Icon、Cursor三种GDI资源,需要分别使用DeleteObject、DestroyIcon、DestroyCursor来释放,不可以混用。
LoadImage函数生成的GDI资源使用后就可以释放,不会因为立即释放后导致前面设置的资源不起作用。
4.CDC、CPEN、CBrush等MFC包装的GDI类,在其析构函数中会调用DeleteObject函数取释放资源。
5.创建GDI资源的函数和释放GDI的函数使用次数要匹配,比如:窗口Create、OnInitDialog、以及消息响应等函数会因为一些原因多次调用(比如DoModal如果被循环调用是会引起窗口的Create和OnInitDialog反复触发),如果在这类函数中申请GDI资源需要特别注意,因为一般作为成员变量的GDI资源的释放在析构函数中的话就只会被调用一次。
6.给外部模块调用的函数中如果包含了GDI资源的申请需要在函数头注释,提醒调用者需要手动释放(往往函数被包装几层后外层函数调用者很容易忽略释放)。
7.少量代码是可以根据代码静态检视或者分模块调试来找出GDI泄漏位置,但是大量代码排查需要借助工具才比较有效率,这里推荐Deleaker这款工具(GDI泄漏和内存泄漏都可以准确的找出代码行)。
GDI泄漏排查经验零散总结的更多相关文章
- C++ 海量代码 排查内存/GDI泄漏历程
排查分两大部分: 1.代码静态分析,通过Code Review查找不合规范的代码点: 2.运行目标软件,结合内存监控工具,分析目标软件的代码,定位内存泄漏点. 目前能找到的代码静态分析软件:Cover ...
- Chrome JS内存泄漏排查方法(Chrome Profiles)
原文网址:http://blog.csdn.net/kaitiren/article/details/19974269 JS内存泄漏排查方法(Chrome Profiles) Google Ch ...
- uilib库gdi句柄泄漏bug修复,duilib防止gdi泄漏的小提醒
转载请说明原出处,谢谢~~ 今天下午群友的网友让我帮忙看一下的duilib程序的问题,程序中包含了List控件,会定时清除所有子项目然后重新添加.但是程序运行一段时间后会自己崩溃!我编译了源码运行后在 ...
- windows 下面的内存泄漏排查.
内存泄漏排查 一下本人只是简单的介绍一个实用, 如果读者很感兴趣, 可以查阅msdn自己去深入调查相关的API和原理. API 介绍 1. 马上打印泄漏信息:_CrtDumpMemoryLeaks() ...
- GDI 泄漏检测方法
方法一 1.打开电脑的[任务管理器],选择[进程]页,点击菜单项的[查看]项,选择[选择列]: 2.勾选[GDI对象(J)]即可. 3.此时,用户就可以在进程中看到每个进程对应的GDI对象,每个进程的 ...
- 填坑总结:python内存泄漏排查小技巧
摘要:最近服务遇到了内存泄漏问题,运维同学紧急呼叫解决,于是在解决问题之余也系统记录了下内存泄漏问题的常见解决思路. 本文分享自华为云社区<python内存泄漏排查小技巧>,作者:luti ...
- Spring Boot引起的“堆外内存泄漏”排查及经验总结
小结: 检索词:C++内存分配器.jvm内存模型.gdb.内存泄露 https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak ...
- 【转载】Spring Boot引起的“堆外内存泄漏”排查及经验总结
背景 为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常.笔者被叫去帮忙查看原因,发现配置了4G堆内 ...
- Spring Boot引起的“堆外内存泄漏”排查及经验总结 strace
小结: 检索词:C++内存分配器.jvm内存模型.gdb.内存泄露 https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak ...
随机推荐
- 【摘抄】深入解析Windows操作系统
一.线程是一个进程内部的实体,也是Windows执行此进程时的调度实体.若没有线程,进程的程序将不可能运行.线程包含以下部件: 1.一组代表处理器状态的CPU寄存器中的内容. 2.两个栈:一个用于线程 ...
- POJ3279(开关后续)
描述: 一个\(n*m的矩阵,每个格子有0和1两种状态.每次可以翻一个格子,并且此格子的上下左右都要被翻.\) \(目标状态应该全为0,求最少翻的次数,输出最小字典序的方案\) 这儿可就麻烦了啊,开关 ...
- H - Fire CodeForces - 864E 01背包
https://codeforces.com/problemset/problem/864/E 这个题目要把这个按照物品毁灭时间进行排序,如果时间短就要排在前面,这个是因为要保证之后的物品的拯救不会影 ...
- 使用Android studio过程中发现的几个解决R变红的办法
刚开始使用Android studio的时候,好几次碰见新建了一个xml文件,或者new了一个activity之后,Android studio莫名其妙的报错了,而显示红色的地方就是常用的(R.id. ...
- Mybatis-入门演示
MyBatis:持久层框架 前言 之前有看过和学习一些mybatis的文章和内容,但是没有去写过文章记录下,现在借鉴b站的狂神视频和官方文档看来重新撸一遍入门.有错误请多指教. 内容 数据访问层-相当 ...
- 自己动手在Linux系统实现一个everything程序
大家好,我是良许. 我们知道,在 Windows 下,有一款非常实用的神器,叫作 Everything ,它可以在极短的时间里,搜索出来你所想要的文件/目录,如下图示: Linux 下也有一些类似于 ...
- docker build报错
docker build 遇到问题 "can not stat ... APPData\Local\Application Data" 解决方法:
- Crash-fix-2:org.springframework.http.converter.HttpMessageNotReadableException
最近开始对APP上的Crash进行对应,发现有好多常见的问题,同一个问题在多个APP都类似的出现了,这里记录下这些常见的错误. crash Log: org.springframework.http. ...
- 死磕synchronized底层实现
点赞再看,养成习惯,微信搜索[三太子敖丙]第一时间阅读. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. 前言 ...
- 笨办法学习python之hashmap
#!/user/bin/env python #-*-coding:utf-8 -*- #Author: qinjiaxi #初始化aMap列表,把列表num_buckets添加到aMap中,num_ ...