内存泄露的关键就是记录分配的内存和释放内存的操作,看看能不能匹配。跟踪每一块内存的声明周期,例如:每当申请一块内存后,把指向它的指针加入到List中,当释放时,再把对应的指针从List中删除,到程序最后检查List就可以知道有没有内存泄露了。Window平台下的Visual Studio调试器和C运行时(CRT)就是用这个原理来检测内存泄露。
在VS中使用时,需加上
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
通过包括 crtdbg.h,将 malloc 和 free 函数映射到其“Debug”版本 _malloc_dbg 和 _free_dbg,这些函数将跟踪内存分配和释放。此映射只在调试版本(在其中定义了 _DEBUG)中发生。发布版本使用普通的 malloc 和 free 函数。
#define 语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。并非绝对需要该语句,但如果没有该语句,内存泄漏转储包含的有用信息将较少。
_CrtDumpMemoryLeaks();
函数将显示当前内存泄露,也就是说程序运行到此行代码时的内存泄露,所有未销毁的对象都会报出内存泄露,因此要让这个函数尽量放到最后。
#define _CRTDBG_MAP_ALLOC
#include<crtdbg.h>
#include<iostream>
using namespace std;
int main()
{
char*str1= (char*)malloc(100);
char*str2 = (char*)malloc(50);
deletestr1;
//输出内存泄露信息
_CrtDumpMemoryLeaks();
return0;
}
由上述代码可知,申请了两块内存,仅释放了一块内存。
运行调试会在输出窗口中输出如下信息:
Detected memory leaks!
Dumping objects ->