使用_CrtSetDbgFlag检测内存泄露
来源:互联网 发布:淘宝怎么虚拟试穿衣服 编辑:程序博客网 时间:2024/05/23 15:46
介绍:
动态分配、回收内存是C/C++编程语言一个最强的特点,但是中国哲学家孙(Sun Tzu,我不知道是谁?那位知道?) 指出,最强的同时也是最弱的。这句话对C/C++应用来说非常正确,在内存处理出错的地方通常就是BUGS产生的地方。一个最敏感和难检测的BUG就是内存泄漏-没有把前边分配的内存成功释放,一个小的内存泄漏可能不需要太注意,但是程序泄漏大块内存,或者渐增式的泄漏内存可能引起的现象是:先是性能低下,再就是引起复杂的内存耗尽错误。最坏的是,一个内存泄漏程序可能用完了如此多的内存以至于引起其他的程序出错,留给用户的是不能知道错误到底来自哪里。另外,一个看上去无害的内存泄漏可能是另一个问题的先兆。幸运的是VC++DEBUGER和CRT库提供了一组有效的检测和定位内存泄漏的工具。本文描述如何使用这些工具有效和系统的排除内存泄漏。
_CrtDumpMemoryLeaks()就是检测从程序开始到执行该函数进程的堆使用情况,通过使用_CrtDumpMemoryLeaks()我们可以进行简单的内存泄露检测。
启用内存泄露检测:
检测内存泄漏的主要工具是调试器和 C 运行时库 (CRT) 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
注意:
#include必须按照以上所示顺序。如果更改了顺序,所使用的函数可能无法使用。
通过包括crtdbg.h,将 malloc 和 free 函数映射到其“Debug”版本 _malloc_dbg 和_free_dbg,这些函数将跟踪内存分配和释放。此映射只在调试版本(在其中定义了 _DEBUG)中发生。发布版本使用普通的 malloc 和 free 函数。
#define 语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。并非绝对需要该语句,但如果没有该语句,内存泄漏转储包含的有用信息将较少。
在添加了上面所示语句之后,可以通过在程序中包括以下语句来转储内存泄漏信息:
_CrtDumpMemoryLeaks()
使用示范:
#include <stdlib.h>
#include <crtdbg.h>
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)
int main()
{
}
这个示范程序与前面讲的多了一个宏定义:
原因稍后再说,我们先看看程序运行(提醒:不要按Ctrl+F5,按F5)后的结果。
Detected memory leaks!
Dumping objects ->
e:workmyprojecttesttesttes
Object dump complete.
“输出”很明显的告诉了你在test.cpp文件的第57行分配了一个40字节的内存而没有释放。在“输出”窗口中选择包含文件名和行号的行,然后按 F4 键即可进入到源文件中分配内存的行。
现在我们再来看看如果不加之前那个new的宏定义会出现怎么样的结果。
程序调试后在“输出”窗口输出如下:
Detected memory leaks!
Dumping objects ->
{48} normal block at 0x00392BB0, 40 bytes long.
Object dump complete.
#define _CRTDBG_MAP_ALLOC
也会引起同样的结果
http://blog.sina.com.cn/s/blog_81084a3a0100tryb.html
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- 使用_CrtSetDbgFlag检测内存泄露
- _CrtSetDbgFlag检测内存泄露
- C/C++中使用_CrtSetDbgFlag检测内存泄露
- vc使用_CrtSetDbgFlag 检测内存泄漏
- c/c++的内存泄露查找 _CrtSetDbgFlag()
- 使用umdh检测内存泄露
- 轻松实现Apache,Tomcat集群和负载均衡
- WDM驱动程序入门-Hello WDM
- 黑马程序员---SQL Server中的函数以及传智播客自学SQL视频笔记
- spring 分散装配
- 第十二章二叉查找树
- 使用_CrtSetDbgFlag检测内存泄露
- Hibernate可选的配置属性
- 在iOS4中使用代码块-基础知识(翻译)
- arraylist和vector的区别
- vc++调用matlab
- 找工作的三六九等
- 在iOS4中使用代码块-基础知识
- SurfaceFlinger启动过程(图)
- springaop术语概述及aop中常见通知的实现(前置,后置,环绕,异常)