• 使用Visual Studio CRT进行内存泄露检测


    我使用的是Visual Studio 11 beta,Win7系统。

    下面示例程序中通过使用_CrtDumpMemoryLeaks() 或 _CrtSetDbgFlag()来进行内存泄露检测。

    当发生内存泄露的时候在debug窗口会给出内存泄露的信息,其中_CrtDumpMemoryLeaks用来需要检测的代码的后面,

    _CrtSetDbgFlag() 用在程序的一开始,总的来说_CrtSetDbgFlag() 比较强大一点。

    在程序的开头最好加上以下宏定义:

    #ifdef _DEBUG
    #define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
    #endif

    这样在debug窗口中会打印出导致产生内存泄露的行。

    下面来看程序:(按F5,开始调试,最后在Debug窗口会给出内存泄露信息)

    #include <cstdlib>
    #include <xdebug>


    #ifdef _DEBUG
    #define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
    #endif


    int main()
    {
     
     // 方法【1】
     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

       int* leak = new int[10];

       //方法【2】
       //_CrtDumpMemoryLeaks();

       return 0;
    }

    运行结果:

    说明:上图中d:\vs11project\mem_leak_detect\mem_leak_detect\mem_leak_detect_01.cpp(16) : {16} normal block at 0x00176F68, 40 bytes long. 16表示发生内存泄露的行,40表示泄露的大小

    这里就顺便说一下前面一片文章(链表合并)中提过的内存泄露论证。在merge()函数中一开始分配的辅助内存空间,初始的时候由mcur 指向该内存区域,随着合并操作的进行 mcur 将不再会指向该快内存区域,导致这块内存区域无法释放。因此使用了全局变量mcur_ 指针来辅助释放。如果不使用该指针的话,使用_CrtSetDbgFlg() 检测就会出现下面的信息:

    这里只是对内存泄露检测进行了粗浅的探讨,如果需要更多方式的时候可以由此出发进一步学习和改进。

  • 相关阅读:
    华为交换机端口安全
    华为路由交换命令收集
    Java使用JodaTime处理时间
    Java遍历Map对象的四种方式
    zabbix-2.4.8-1添加MySQL状态监控
    zabbix-2.4.8-1添加tcp状态监控
    zabbix-2.4.8-1添加nginx状态监控
    我的第四个Python小程序
    我的第三个Python小程序
    我的第二个Python小程序
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2508806.html
Copyright © 2020-2023  润新知