zoukankan      html  css  js  c++  java
  • 使用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() 检测就会出现下面的信息:

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

  • 相关阅读:
    Python基础知识大总结
    Python基础教程第一章 python基础知识
    XDUOJ 1000-1002题解
    C# PDF格式 下载
    C# 文件(图片)下载
    C# DataTable转List
    C# Excel导入与导出
    C# 文件压缩与解压
    C# 文件流 导入 导出
    C# lambda表达式
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2508806.html
Copyright © 2011-2022 走看看