对开发中常见的内存泄露,GDI泄露进行检测

一、GDI泄露检测方法:

在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况。

注意点:Create出来的GDI对象,都要用DeleteObject来释放;Create出来的DC,都要用DeleteDC来释放,GetDC得出的DC,要用ReleaseDC来释放。

以下是一些常用到的函数:

1、  检查GetWindowDC(), 后面是否有ReleaseDC();

2、  检测GetDC();后面是否有ReleaseDC();

3、  检测画刷CBrush:

CreateSolidBrush()-》 DeleteObject();

4、  检测画笔 CPen

CreatePen()->DeleteObject();

5、  检测创建字体CFont

CreateFont->DeleteObject();

CreatePointFont()->DeleteObject();

6、  检测 创建WIN32窗口

HWND hwnd = ::CreateWindow ()  ->  DestroyWindow(hwnd);

7、  CBitmapbmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());

后面要有bmp.DeleteObject();

8、  CFont *pOldFont =pDC->SelectObject(&m_font);

是否有pDC->SelectObject(pOldFont);

9、  CRgn

CreateRoundRectRgn() ->  DeleteObject();

10、Graphics gc(pDC)   -> gc.ReleaseDC(pDC);

11、CDialog对话框  Create() 出来的,需要有  DestroyWindow();

12、凡是通过函数得到句柄的都需要用CloseHandle(句柄)来释放;

如:HANDLE, HBRUSH ,HPEN

HANDLE hFile = CreateFile();  -> CloseHandle(hFile);

二、内存的检测方法:

通过任务管理器中的“内存”列表,或是procexp.exe来观察是否出现内存泄露

1、检查下列函数是否有一一对应:

new   -> delete;

Malloc -> free;

GlobalAlloc  -> GlobalFree

2、通过调试器和CRT调试堆来检测泄露

把这个语句放到软件的结束部分_CrtDumpMemoryLeaks(); 在调试下运行程序时,如果有泄漏,就会在输出窗口显示内存泄露信息。

3、借助内存泄露检测工具如:BChecker6.01 这个是适合VC6的,有时间可以去下来使用。

对开发中常见的内存泄露,GDI泄露进行检测的更多相关文章

  1. Android开发中常见的内存泄露案例以及解决方法总结

    1.单例模式引起的内存泄露 由于单例模式的静态特性,使得它的生命周期和我们的应用一样长,如果让单例无限制的持有Activity的强引用就会导致内存泄漏如错误代码示例: public class Use ...

  2. C程序中常见的内存操作错误

    对C/C++程序员来说,管理和使用虚拟存储器可能是个困难的, 容易出错的任务.与存储器有关的错误属于那些令人惊恐的错误, 因为它们在时间和空间上, 经常是在距错误源一段距离之后才表现出来. 将错误的数 ...

  3. 【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

    原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构 ...

  4. 错误内存【读书笔记】C程序中常见的内存操作有关的典型编程错误

    题记:写这篇博客要主是加深自己对错误内存的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 对C/C++程序员来讲,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的 ...

  5. 《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

    对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才 ...

  6. Java开发中常见的危险信号(上)

    本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...

  7. Android开发中常见的设计模式 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. 【转】.NET+AE开发中常见几种非托管对象的释放

    尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 今天在开发时遇到一个问题:" 未处理 System.AccessViolationException Message="尝试 ...

  9. iOS开发中常见的一些异常

    iOS开发中常见的异常包括以下几种NSInvalidArgumentExceptionNSRangeExceptionNSGenericExceptionNSInternallnconsistency ...

随机推荐

  1. mysql获取各种日期

    select curdate(); --获取当前日期 select last_day(curdate()); --获取当月最后一天. select DATE_ADD(curdate(),interva ...

  2. EBS 开发中如何动态启用和禁止请求(Current Request)的参数

    EBS 开发中如何动态启用和禁止请求(Current Request)的参数 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 我们可以使用依赖 ...

  3. frame,iframe,frameset用法和区别

    ■ 框架概念 : 所谓框架便是网页画面分成几个框窗,同时取得多个 URL.只需要 <FRAMESET> <FRAME> 即可,而所有框架标记需要放在一个总起的 html 档,这 ...

  4. Generative Learning algorithms

    "generative algorithm models how the data was generated in order to categorize a signal. It ask ...

  5. ubuntu下lamp环境配置及将window代码迁移至linux系统

    因为最近要用需要去实现项目中的一个功能,比较好的做法就是在http://i.cnblogs.com/EditPosts.aspx?opt=1linux中实现.所以最近就将自己的代码全部迁移到linux ...

  6. centeros resin安装脚本启动

    公司用的服务器是resin+apache #! /bin/sh # # See contrib/init.resin for /etc/rc.d/init.d startup script # # r ...

  7. Android 获取屏幕分辨率

    原文:Android 获取屏幕分辨率 得到一个屏幕尺寸的三种方法如下:        // 通过WindowManager获取        DisplayMetrics dm = new Displ ...

  8. Android 保存图片到SQLite,读出SQLite中的图片

    1.bitmap保存到SQLite 中 数据格式: db.execSQL("Create table express ( _id INTEGER PRIMARY KEY AUTOINCREM ...

  9. mybatis.generator.configurationFile

    mybatis.generator.configurationFile 有一个更好的配置方法,可以不用在generateConfig.xml里面写死驱动的地址:如果你的mybatis连接也是在pom. ...

  10. ubuntu 下编译内核

    目的: 1. 练习.网上有很多类似的文章可供参考. 2. 为写qemu的watchdog驱动练手. 有朋友问make的 watchdog驱动 需要什么准备,所以写这个blog. 环境: ubuntu ...