对开发中常见的内存泄露,GDI泄露进行检测
对开发中常见的内存泄露,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泄露进行检测的更多相关文章
- Android开发中常见的内存泄露案例以及解决方法总结
1.单例模式引起的内存泄露 由于单例模式的静态特性,使得它的生命周期和我们的应用一样长,如果让单例无限制的持有Activity的强引用就会导致内存泄漏如错误代码示例: public class Use ...
- C程序中常见的内存操作错误
对C/C++程序员来说,管理和使用虚拟存储器可能是个困难的, 容易出错的任务.与存储器有关的错误属于那些令人惊恐的错误, 因为它们在时间和空间上, 经常是在距错误源一段距离之后才表现出来. 将错误的数 ...
- 【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误
原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构 ...
- 错误内存【读书笔记】C程序中常见的内存操作有关的典型编程错误
题记:写这篇博客要主是加深自己对错误内存的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 对C/C++程序员来讲,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的 ...
- 《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误
对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才 ...
- Java开发中常见的危险信号(上)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- Android开发中常见的设计模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 【转】.NET+AE开发中常见几种非托管对象的释放
尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 今天在开发时遇到一个问题:" 未处理 System.AccessViolationException Message="尝试 ...
- iOS开发中常见的一些异常
iOS开发中常见的异常包括以下几种NSInvalidArgumentExceptionNSRangeExceptionNSGenericExceptionNSInternallnconsistency ...
随机推荐
- MYSQL区分大小写
MYSQL区分大小写 1.linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写: 2.用root帐号登录后,在/etc/my.cnf 中的[mysqld]后添加添加lower ...
- onload ready
确保在 <body> 元素的onload事件中没有注册函数,否则不会触发$(document).ready()事件. 可以在同一个页面中无限次地使用$(document).ready()事 ...
- windows7 64位下运行 regsvr32 注册ocx或者dll的方法
来源:转载 it won't work for you unless you have some form of Visual Basic tools loaded on your system: ...
- eclipse 快捷键汇总
1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shift+F2 显示搜索对话框:Ctrl+H快速O ...
- 编写一个程序实现strcat函数的功能
写自己的strcat函数------→mycat #include <stdio.h> #include <string.h> #define N 5 char *mycat( ...
- s3c6410学习笔记-烧写uboot+构建文件系统
一.进入目录 #cd u-boot-1.1.6_sndk6410 二.SD卡 make clean make distclean vim Makefile ...
- Oracle EBS-SQL (SYS-3):sys_人员用户名对应关系查询.sql
select fu.user_name 用户名, fu.description 描述, (select ppf.FULL_NAME from per_peop ...
- 深入Android媒体存储服务(一):APP与媒体存储服务的交互
简介: 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 APP 新增或修改的文 ...
- Android 使用Jsoup解析Html
想要做一个看新闻的应用,类似Cnbeta客户端的东西.大致思路如下:根据链接获取新闻列表页的html代码,然后解析,找到所有的新闻标题和新闻链接用listView显示,当点击ListView的Item ...
- Android使用VideoView播放网络视频
Android支持播放网络上的视频.在播放网络上的视频时,牵涉到视频流的传输,往往有两种协议,一种是HTTP,一种是RTSP.这 两种协议最大的不同是,HTTP协议,不支持实时流媒体的播放,而RTSP ...