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 记:

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

  • 相关阅读:
    C# 给图片添加透明的文字、图片水印
    Parallel.Invoke 并行的使用
    C# 使用NPOI 导出Excel
    选择性的使用 serialize() 进行序列化
    C#中 计时器用法
    关于图片加载失败后显示默认图片
    C# 文件下载
    C#中 什么是装箱和拆箱
    MySql中 where IN 字符串
    管理信息系统 课程设计
  • 原文地址:https://www.cnblogs.com/hcklqy/p/14724637.html
Copyright © 2011-2022 走看看