标签: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
,内存泄漏报告都显示上面的信息。
标签:crt 释放 free turn set leaks 说明 未能 其他应用
原文地址:https://www.cnblogs.com/cai21811998/p/9872414.html