• <crtdbg.h> 的作用


    1、在调试状态下让win程在输出窗口中显示调试信息,可以用_RPTn 宏n为显示参数比如_RPT0(_CRT_WARN,"text"); 

      _RPT1(_CRT_WARN,"%d", iTest); _RPT2(_CRT_WARN,"%d,%f", iTest, fTest);....依次类推,详细见msdn

     

    2、侦测内存泄露用_CrtSetDbgFlag函数 

       _CrtDumpMemoryLeaks()在程序退出点之前调用会在输出中产生内存泄露信息,但是如果程序有多个退出点则无需

       在所有退出点都调用该函数,取而代之的是简单的在main()一开始就首先调用

        _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);这样程序会在退出前自动调用_CrtDumpMemoryLeaks()


      产生的信息类似: 

     

    Detected memory leaks!
    Dumping objects ->
    C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.cpp(20) : {18}
    normal block at 0x00780E80, 64 bytes long.
    Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
    Object dump complete.
        要在Dumpint objects -> 后面产生文件名的话来确定 泄露文件与代码行号的话(见上面红字部分)则需要在

     

      #include <crtdbg.h>之前加上宏#define _CRTDBG_MAP_ALLOC 

     

    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>      //msdn里面的例子加了该头文件
    #include <crtdbg.h>
     

     

    查找泄露技巧 使用_CrtSetBreakAlloc(long lBreakAlloc );函数参数为内存分配的次数,其值为调试信息的{}中的值

    上面的例子为{18}

    于是让程序自动在泄露处进入断点可以在_CrtSetDbgFlag后面添加函数_CrtSetBreakAlloc(18);然后调试程序时,程序

    自动断在第18次分配内存的时的crt代码处,然后只要通过查看调用堆栈就可以轻松看到之前的泄露的代码了 

  • 相关阅读:
    MySQL(一)序
    Mockito 小结
    如何入门一个开源软件
    面经
    琐碎的想法(四)键盘布局、快捷键的由来
    琐碎的想法(二)网络协议——人们给计算机的一组“约定”
    Java源码赏析(六)Class<T> 类
    Java随谈(五)Java常见的语法糖
    Java随谈(四)JDK对并发的支持
    Event Loop和宏任务微任务
  • 原文地址:https://www.cnblogs.com/lvchaoshun/p/5906879.html
Copyright © 2020-2023  润新知