这是在win10 vs2012的环境下进行的实验。主要参考的博客和回答有:
- 疯狂-的-蜗牛:https://blog.csdn.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,可以使用 valgrind 工具