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