Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14497975
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:58:25

下载本文示例代码
  具有动态的分配和释放内存的能力是C/C 程序语言的重要特色之一。VisualC debugger和CRT库提供了一系列有效的检测和鉴定内存泄漏的工具。   设置内存泄漏检测  检测内存泄漏的基本工具是调试器和CRT调试堆函数。为了使用调试堆函数,在你的程序中你必须含有下面的说明: #define _CRTDBG_MAP_ALLOC#include#include  必须保证上面声明的顺序,如果改变了顺序,可能不能正常工作。的_malloc_dbg和_free_dbg将取代标准的malloc和free函数出现在DEBUG版中,它可以跟踪内存的分配和释放。但是这只会在DEBUG版本中发生(当#define _DEBUG的时候),而Release版本仍使用标准的malloc和free功能。#define _CRTDBG_MAP_ALLOC表示使用CRT堆函数的相应的DEBUG版本。这个定义不是必须的,但是没有它,内存泄漏报告含有的只是没有什么用处的信息。  一旦你已经添加了刚才的声明,你就能够通过在程序中加入下面的代码来报告内存泄漏信息: _CrtDumpMemoryLeaks();  当在DEBUG模式下运行程序时,在Output窗口的Debug标签处_CrtDumpMemoryLeaks会显示内存泄漏的信息,例如: Detected memory leaks!Dumping objects ->C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.Data:< > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.   如果没有#define _CRTDBG_MAP_ALLOC,内存泄漏报告就会像下面这样: Detected memory leaks!Dumping objects ->{18} normal block at 0x00780E80, 64 bytes long.Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.  由此可见,定义_CRTDBG_MAP_ALLOC时,_CrtDumpMemoryLeaks可以提供更多的有用信息。  如果没有定义_CRTDBG_MAP_ALLOC,那么内存泄漏报告如下显示:   内存分配数值(花括号内)   模块的类型(normal、client或者CRT)   以十六进制格式定位的内存   以字节计模块的大小   第一个十六字节的内容(也可以用十六进制)  如果定义了_CRTDBG_MAP_ALLOC,报告的内容还包括出现分配所泄漏内存的文件。在文件名之后括号内的数字是文件内的行数值。  此时双击包含行数值和文件名的输出行, 或者选择输出行并按F4:C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.  编辑窗口将会跳到文件中分配所泄漏内存的那一行代码,leaktest.cpp中的行号为20的那一行。   使用_CrtSetDbgFlag  如果你的程序只在一个地方退出,那么在选择调用_CrtDumpMemoryLeaks的位置是非常容易的。但是,如果你的程序可能会在程序多处位置退出该怎么办?如果不希望在每一个可能的出口处调用_CrtDumpMemoryLeaks,那么你可以在你的程序开始处包含下面的调用:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);  当程序退出时,将会自动地调用_CrtDumpMemoryLeaks(必须设置_CRTDBG_ALLOC_MEM_DF和 _CRTDBG_LEAK_CHECK_DF)。  翻译内存模块的类型  内存泄漏报告中把每一块泄漏的内存分为普通块、客户块和CRT块。事实上,你只需要留心普通块和客户块类型。  普通块(normal block):是由你的程序分配的内存。  客户块(client block):是一种特殊的内存块,它是由MFC使用的一个对象,程序退出时,该对象的析构函数没有被调用。MFC new操作符可以用来创建普通块和客户块。  CRT块(CRT block):是由C RunTime Library供自己使用而分配的内存块。CRT库自己来管理这些内存的分配与释放,通常你不会在内存泄漏报告中发现有CRT内存泄漏,除非程序发生了严重的错误(例如CRT库崩溃)。  下面这两种类型的内存块不会出现在内存泄漏报告中:   空闲块(free block):已经被释放(free)的内存块。   忽略块(Ignore block):是程序员显式声明过不要在内存泄漏报告中出现的内存块。共2页。 1 2 :   具有动态的分配和释放内存的能力是C/C 程序语言的重要特色之一。VisualC debugger和CRT库提供了一系列有效的检测和鉴定内存泄漏的工具。   设置内存泄漏检测  检测内存泄漏的基本工具是调试器和CRT调试堆函数。为了使用调试堆函数,在你的程序中你必须含有下面的说明: #define _CRTDBG_MAP_ALLOC#include#include  必须保证上面声明的顺序,如果改变了顺序,可能不能正常工作。的_malloc_dbg和_free_dbg将取代标准的malloc和free函数出现在DEBUG版中,它可以跟踪内存的分配和释放。但是这只会在DEBUG版本中发生(当#define _DEBUG的时候),而Release版本仍使用标准的malloc和free功能。#define _CRTDBG_MAP_ALLOC表示使用CRT堆函数的相应的DEBUG版本。这个定义不是必须的,但是没有它,内存泄漏报告含有的只是没有什么用处的信息。  一旦你已经添加了刚才的声明,你就能够通过在程序中加入下面的代码来报告内存泄漏信息: _CrtDumpMemoryLeaks();  当在DEBUG模式下运行程序时,在Output窗口的Debug标签处_CrtDumpMemoryLeaks会显示内存泄漏的信息,例如: Detected memory leaks!Dumping objects ->C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.Data:< > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.   如果没有#define _CRTDBG_MAP_ALLOC,内存泄漏报告就会像下面这样: Detected memory leaks!Dumping objects ->{18} normal block at 0x00780E80, 64 bytes long.Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.  由此可见,定义_CRTDBG_MAP_ALLOC时,_CrtDumpMemoryLeaks可以提供更多的有用信息。  如果没有定义_CRTDBG_MAP_ALLOC,那么内存泄漏报告如下显示:   内存分配数值(花括号内)   模块的类型(normal、client或者CRT)   以十六进制格式定位的内存   以字节计模块的大小   第一个十六字节的内容(也可以用十六进制)  如果定义了_CRTDBG_MAP_ALLOC,报告的内容还包括出现分配所泄漏内存的文件。在文件名之后括号内的数字是文件内的行数值。  此时双击包含行数值和文件名的输出行, 或者选择输出行并按F4:C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.  编辑窗口将会跳到文件中分配所泄漏内存的那一行代码,leaktest.cpp中的行号为20的那一行。   使用_CrtSetDbgFlag  如果你的程序只在一个地方退出,那么在选择调用_CrtDumpMemoryLeaks的位置是非常容易的。但是,如果你的程序可能会在程序多处位置退出该怎么办?如果不希望在每一个可能的出口处调用_CrtDumpMemoryLeaks,那么你可以在你的程序开始处包含下面的调用:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);  当程序退出时,将会自动地调用_CrtDumpMemoryLeaks(必须设置_CRTDBG_ALLOC_MEM_DF和 _CRTDBG_LEAK_CHECK_DF)。  翻译内存模块的类型  内存泄漏报告中把每一块泄漏的内存分为普通块、客户块和CRT块。事实上,你只需要留心普通块和客户块类型。  普通块(normal block):是由你的程序分配的内存。  客户块(client block):是一种特殊的内存块,它是由MFC使用的一个对象,程序退出时,该对象的析构函数没有被调用。MFC new操作符可以用来创建普通块和客户块。  CRT块(CRT block):是由C RunTime Library供自己使用而分配的内存块。CRT库自己来管理这些内存的分配与释放,通常你不会在内存泄漏报告中发现有CRT内存泄漏,除非程序发生了严重的错误(例如CRT库崩溃)。  下面这两种类型的内存块不会出现在内存泄漏报告中:   空闲块(free block):已经被释放(free)的内存块。   忽略块(Ignore block):是程序员显式声明过不要在内存泄漏报告中出现的内存块。共2页。 1 2 : 下载本文示例代码


在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏在Visual C 中检测和隔离内存泄漏
阅读(94) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~