码迷,mamicode.com
首页 > 编程语言 > 详细

c/c++使用 CRT 库查找内存泄漏

时间:2018-10-29 20:05:47      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:crt   释放   free   turn   set   leaks   说明   未能   其他应用   

前言:

内存泄漏,即未能正确释放以前分配的内存,是 C/C++ 应用程序中最难以捉摸也最难以检测到的 Bug 之一。 最初少量内存泄漏可能不引人注目,但随着时间的推移,内存泄漏越来越多,就会出现一些征兆,包括性能下降,在应用程序内存不足时发生崩溃。 更严重的是,占用了所有可用内存的泄漏应用程序可能会导致其他应用程序崩溃,从而无法确定问题出在哪个应用程序。 即使看似无害的内存泄漏也可能说明存在其他问题应当纠正。

借助 Visual Studio 调试器和 C 运行时 (CRT) 库,可以检测和识别内存泄漏。

启动内存泄漏检测:

检测内存泄漏的主要工具是调试器和 C 运行库 (CRT) 调试堆函数。

若要启用调试堆函数,请在程序开头包括以下语句:

#define _CRTDBG_MAP_ALLOC
 #include <stdlib.h> 
#include <crtdbg.h>  

且引用顺序不能改变!!

使用这些语句启用调试堆函数之后,可以在某个应用程序退出点之前设置一个对 _CrtDumpMemoryLeaks 的调用,以便在应用程序退出时显示内存泄漏报告:

_CrtDumpMemoryLeaks();

如果应用程序有多个退出点,并不需要在每个退出点都手动设置一个对 _CrtDumpMemoryLeaks 的调用。 main函数开头部分对 _CrtSetDbgFlag 的调用会导致在每个退出点自动调用 _CrtDumpMemoryLeaks。 你必须设置两个位域,如下所示:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 

默认情况下,_CrtDumpMemoryLeaks 将内存泄漏报告输出到“输出”窗口的“调试”窗格中。 你可以使用 _CrtSetReportMode 将该报告重定向到其他位置。

如果使用库,该库可能会将输出重置到另一位置。 在此情况下,可以将输出位置设置回“输出”窗口,如下所示:

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG ); 

 

实例:

 1 #define _CRTDBG_MAP_ALLOC
 2 #include <stdlib.h>
 3 #include <crtdbg.h>           //为了 CRT 函数能够正常工作,#include 语句必须遵循此处所示的顺序
 4 #include <stdio.h>  
 5 
 6 int main() {
 7     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
 8     char*a = NULL;//声明一个char*类型的指针
 9 
10     a = (char*)malloc( sizeof(char)*100);  //使用malloc分配内存的首地址,然后赋值给a
11 
12     if (!a)
13 
14     {
15         perror("malloc");
16         return-1;
17     }
18 
19     sprintf(a, "%s", "Hello  World\n");  //"HelloWorld\n"写入a指向的地址
20 
21     printf("%s\n", a);  //输出用户输入的数据
22 
23     //free(a);  //释放掉使用的内存地址
24     system("pause");
25     return 0;
26 }
27     

为了测试,我们将free(a)注释掉,得到的结果如下:

Detected memory leaks!
Dumping objects ->
d:\c++lianxi\c++items\neicun\neicun\test.cpp(10) : {81} normal block at 0x002DC1E0, 100 bytes long.
 Data: <Hello  World    > 48 65 6C 6C 6F 20 20 57 6F 72 6C 64 0A 00 CD CD 
Object dump complete.
  • 内存分配编号,在本例中为 81

  • 块类型,在本例中为 normal

  • 十六进制内存位置,在本例中为0x002DC1E0。

  • 块的大小,在本例中为 100  bytes

  • 块中前 16 个字节的数据(十六进制形式)

如果应用程序未定义 _CRTDBG_MAP_ALLOC,则 _CrtDumpMemoryLeaks 显示的内存泄漏报告如下所示:

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,内存泄漏报告都显示上面的信息。

 

c/c++使用 CRT 库查找内存泄漏

标签:crt   释放   free   turn   set   leaks   说明   未能   其他应用   

原文地址:https://www.cnblogs.com/cai21811998/p/9872414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!