在学习c++编写代码过程中,使用内置指针进行动态内存分配时,总是有意无意忘记释放内存,但又希望自己能在控制台上输出 内存泄露信息,
网络上查询到使用vld,但已经在4年前不再更新,也不支持我现在vs2019版本,虽然可以降到2015版,但终究不爽。
在microsoft 官网查文档,可以使用如下手段进行一些粗浅提示:
检测内存泄漏的主要工具是C/ c++调试器和C运行时库(CRT)调试堆函数。要启用所有的调试堆函数,请在c++程序中包含以下语句,顺序如下:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>上述技术为使用标准CRT malloc函数分配的内存识别内存泄漏。但是,如果您的程序使用c++ new操作符分配内存,那么您可能只能在内存泄漏报告中看到操作符new调用_malloc_dbg的文件名和行号。
要创建一个更有用的内存泄漏报告,你可以写一个像下面这样的宏来报告进行分配的行:
#ifdef _DEBUG
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the
// allocations to be of _CLIENT_BLOCK type
#else
#define DBG_NEW new
#endif
完整代码:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define DBG_NEW new ( _CLIENT_BLOCK , __FILE__ , __LINE__ )
// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the
// allocations to be of _CLIENT_BLOCK type
#else
#define DBG_NEW new
#endif
int main()
{
try {
int* i = DBG_NEW int();//需要使用DEG_NEW 暂时替代new 作为跟踪,需要debug调试模式下才起作用, 发布版本应该任然使用 new,这里只是一个例子
}
catch (runtime_error err) {
cout << err.what();
}
_CrtDumpMemoryLeaks();//打印释放内存报告
}
输出显示:

在源文件第58行 ,位置0x008F9598 , int 4字节整形,低4位都是十六进制00,动态内存没有安全释放。
如果是使用了delete 或者 智能指针,就不会出现这一行数据。这样测试往往 是把打印放在函数外面,一般是{} 结束之后,不要放在函数里面测试,
不然得到的永远是泄露泄露!
后面两行normal block 应该是程序正常输出提示。
















