转载链接 彻底解决GDI对象泄漏的问题
之前有一个项目因为那时对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/
本文详细介绍了如何解决C++程序中出现的GDI对象泄漏问题,包括位图、画刷等GDI对象的正确创建与销毁方法,并强调了在使用设备上下文时应注意的事项。

3万+

被折叠的 条评论
为什么被折叠?



