彻底解决GDI对象泄漏的问题
来源:互联网 发布:淘宝产品十年事 pdf 编辑:程序博客网 时间:2024/06/05 18:20
之前有一个项目因为那时对C++还不太熟悉,没有太多经验,造成了内存泄漏、线程同步、GDI对象泄漏等新手常见的问题,所以这个程序会不定时地莫名其妙地死掉,后来通过用Visual Leak Detector小心翼翼地解决了内存泄漏的问题,接着系统就稳定了很多,而且也重新看了多线程那部分,加了多个锁,也总算解决了线程同步的问题。然而系统还是隔一段时间死掉,后来在任务管理器里发现其”GDI对象“只增不减,原来还有GDI对象泄漏啊,这个好像在网上都找不到什么软件进行检测,后来查了半日资料,发现原来创建的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
这里还有一个问题需要注意,就是设备DC需要调用SelectObject方法来选取不同的GDI对象,当选择GDI对象时必须用一个指针记录替换出来的对象,当要结束绘图的时候再用该DC调用SelectObject方法把替换出来的对象放回去,这时调用以上的销毁方法才能成功,要不也是不能清除GDI对象的,切记。
这些问题改了我不少时间啊,以后写程序的时候一定不要再像新手一样,写得这么随便了。
参照了网上:http://lmx18.blog.163.com/blog/static/43493679201166115036889/
- 彻底解决GDI对象泄漏的问题
- 彻底解决GDI对象泄漏的问题
- 彻底解决GDI对象泄漏的问题
- GDI对象猛增,GDI资源泄漏的问题
- 关于IE控件frameset导致GDI对象泄漏的问题
- 关于应用程序出现窗口不完整,GDI对象猛增,GDI资源泄漏的问题的探讨
- 【问题】GDI泄漏
- GDI对象和CDC的使用方法(防止资源泄漏)
- GDI 绘图 内存泄漏问题
- GDI+ RectF内存泄漏问题
- CPrintDialog之内存与GDI对象泄漏
- VC++中GDI对象的释放问题
- GDI+ 对象释放崩溃的问题
- GDI泄漏
- 软件运行中界面显示异常——GDI资源泄漏问题的排查过程
- 彻底解决Fragment重叠的问题
- GDI+对象的释放
- GDI对象的使用
- Ranorex入门指南
- Linux BFS简介
- VC生成的dll环境配置(修改名称)
- Markdown 文件格式说明 (Markdown syntax guide)
- HDU 1104 Remainder( BFS(广度优先搜索))
- 彻底解决GDI对象泄漏的问题
- Android记录4--自定义ToggleButton+用SharedPreferences保存用户配置
- HDU 3790 最短路径问题 (双重权值) dp
- js中将字符串转换成json的三种方式
- HTML URL 字符编码
- JNDI 笔记
- java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
- Android的电池的管理
- 无线网卡的AP和STA模式