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泄漏和内存泄漏都可以准确的找出代码行)。

最新文章

  1. jvm系列(三):java GC算法 垃圾收集器
  2. CF719C. Efim and Strange Grade[DP]
  3. 边工作边刷题:70天一遍leetcode: day 85-3
  4. Java集合框架(一)
  5. DWZ (JUI) 教程 国际化问题(多语言/语言切换)
  6. 狗狗40题~(Volume B)
  7. C++初始化顺序
  8. Java编程测试_类的使用
  9. 关于Net开发中一些SQLServer性能优化的建议
  10. Alibaba Cluster Data 开放下载:270GB 数据揭秘你不知道的阿里巴巴数据中心
  11. CSS3_文本样式
  12. vscode打开django项目pylint提示has not "object" member
  13. 潭州课堂25班:Ph201805201 django 项目 第四十三课 后台 用户管理前后功能实现 (课堂笔记)
  14. OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out
  15. Linux笔记 rm -rf 嘻嘻
  16. Python fullstack系列【1】:初识Python
  17. RequireJS 参考文章
  18. Python acos() 函数
  19. jquery Ajax请求中显示Loading...
  20. linux有用技巧:使用ntfs-3g挂载ntfs设备

热门文章

  1. Jenkins 项目构建
  2. 11.秋招复习简单整理之什么是ICMP协议,ICMP协议的功能是什么?
  3. ubuntu16 安装redis
  4. springboot打包启动时报mybatis的typeAlias类名找不到的错误
  5. golang server示例
  6. Java 创建并应用PPT幻灯片母版
  7. Java——Spring超详细总结
  8. Spring Cloud Alibaba系列(一)nacos作为服务注册中心
  9. CC2530应用——按键控制灯光状态变化
  10. 龙贝格算法 MATLAB实现