使用Visual Studio CRT进行内存泄露检测

我使用的是Visual Studio 11 beta,Win7系统。

下面示例程序中通过使用_CrtDumpMemoryLeaks() 或 _CrtSetDbgFlag()来进行内存泄露检测。

当发生内存泄露的时候在debug窗口会给出内存泄露的信息,其中_CrtDumpMemoryLeaks用来需要检测的代码的后面,

_CrtSetDbgFlag() 用在程序的一开始,总的来说_CrtSetDbgFlag() 比较强大一点。

在程序的开头最好加上以下宏定义:

#ifdef _DEBUG
#define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

这样在debug窗口中会打印出导致产生内存泄露的行。

下面来看程序:(按F5,开始调试,最后在Debug窗口会给出内存泄露信息)

#include <cstdlib>
#include <xdebug>


#ifdef _DEBUG
#define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif


int main()
{
 
 // 方法【1】
 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

   int* leak = new int[10];

   //方法【2】
   //_CrtDumpMemoryLeaks();

   return 0;
}

运行结果:

说明:上图中d:\vs11project\mem_leak_detect\mem_leak_detect\mem_leak_detect_01.cpp(16) : {16} normal block at 0x00176F68, 40 bytes long. 16表示发生内存泄露的行,40表示泄露的大小

这里就顺便说一下前面一片文章(链表合并)中提过的内存泄露论证。在merge()函数中一开始分配的辅助内存空间,初始的时候由mcur 指向该内存区域,随着合并操作的进行 mcur 将不再会指向该快内存区域,导致这块内存区域无法释放。因此使用了全局变量mcur_ 指针来辅助释放。如果不使用该指针的话,使用_CrtSetDbgFlg() 检测就会出现下面的信息:

这里只是对内存泄露检测进行了粗浅的探讨,如果需要更多方式的时候可以由此出发进一步学习和改进。

原文地址:https://www.cnblogs.com/zhuyp1015/p/2508806.html