调试C++代码内存释放,在VS控制台显示内存泄露

时间:2024-03-10 19:51:34

   在学习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 应该是程序正常输出提示。

 

 

 

 

 

 

2021-04-05 记:

  看了下楼价,依然高耸,我默默放下手机,朋友圈经常晒酒吧喝酒的女孩依然不怎么理我,或许这会正躺在哪张床上 ,我觉得我依然还有动力,干他娘这个世界。