C++ 使用VS进行内存泄漏检查
这是在win10 vs2012的环境下进行的实验。主要参考的博客和回答有:
- 疯狂-的-蜗牛:https://blog..net/mfcing/article/details/42673393
- vczh的回答:https://www.zhihu.com/question/63946754
首先在代码顶部加上如下语句:
#ifdef VCZH_CHECK_MEMORY_LEAKS #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #define VCZH_CHECK_MEMORY_LEAKS_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) #define new VCZH_CHECK_MEMORY_LEAKS_NEW #endif
在main函数最后一行,加入:
_CrtDumpMemoryLeaks()
紧接着,使用VS的调试功能
这里使用的例子: 如果出现内存泄漏现象,在VS输出框会出现类似提示:
Detected memory leaks! Dumping objects -> {453} normal block at 0x02432CA8, 868 bytes long. Data: <404303374 > 34 30 34 33 30 33 33 37 34 00 00 00 00 00 00 00 {447} normal block at 0x024328B0, 868 bytes long. Data: <404303374 > 34 30 34 33 30 33 33 37 34 00 00 00 00 00 00 00
取其中一条详细说明:{453} normal block at 0x02432CA8, 868 bytes long.
被{}包围的453就是我们需要的内存泄漏定位值,868 bytes long就是说这个地方有868比特内存没有释放。
接下来,定位代码位置:
在main函数第一行加上:
_CrtSetBreakAlloc(453);
意思就是在申请453这块内存的位置中断。然后调试程序,程序中断了。查看调用堆栈。 双击我们的代码调用的最后一个函数,找到问题代码,进行修改。
对于linux,可以使用