您的位置:首页 > 其它

GDI泄露,程序发布之前的审核

2016-10-18 11:21 162 查看
转载地址:http://lmx18.blog.163.com/blog/static/43493679201166115036889/
http://blog.csdn.net/fion45/article/details/9967753
之前有一个项目因为那时对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对象的,切记。

这些问题改了我不少时间啊,以后写程序的时候一定不要再像新手一样,写得这么随便了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: