zoukankan      html  css  js  c++  java
  • 调试C++代码内存释放,在VS2019控制台显示内存泄露

       在学习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 记:

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

  • 相关阅读:
    kettle Switch / Case Verification fails on working Tranfsormation
    KETTLE 并行任务设置
    查看ORACLE各表空间使用情况
    KETTLE使用小记
    ORACLE IMP三种模式
    倒腾ORACLE小记
    KETTLE xls表格导入
    绕点旋转(老问题)
    TransformToolControl.as
    钻石恒久远,一颗永流传
  • 原文地址:https://www.cnblogs.com/hcklqy/p/14724637.html
Copyright © 2011-2022 走看看