项目中造成了内存泄漏、线程同步、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对象的,切记。