zoukankan      html  css  js  c++  java
  • C++内存泄露调试

          我在看DirectX Sample的时候,看到以下代码:

    1 // Enable run-time memory check for debug builds.
    2 #if defined(DEBUG) | defined(_DEBUG)
    3 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

      既然是debug,肯定是多输出了什么信息,根据注释来看,应该是可以检测出内存使用的相关错误。而在C++中,内存泄露一直是一个很蛋疼的问题,以前不知道有什么方法解决。顺着这段代码上网搜了下,果然有内存泄露的检测。

    以下转自http://blog.csdn.net/hayyoung/article/details/8565871

    一、vs监测内存泄露,利用crt库就可以,不需要利用专门的工具。操作仅2步。

    1、增加宏和头文件

    1 #define _CRTDBG_MAP_ALLOC   
    2 #include <stdlib.h>  
    3 #include <crtdbg.h>  

      注意:为了保证这三行代码的顺序,最前面放这三行代码。假设我们在这3行之前,增加#include <iostream>, 因iostream包含了stdlib.h,则会隐式破坏顺序,导致malloc函数内存泄露的时候,输出信息窗口不显示具体的行数。

    2、程序仅一个出口(return),在需要监测地方,调用_CrtDumpMemoryLeask函数,运行程序后,输出消息窗口显示内存泄露的地方。

    1 _CrtDumpMemoryLeaks();

    如果程序有几个出口(return),不需要显式调用_CrtDumpMemoryLeask(),仅用_CrtSetDbgFlag 设置_CRTDBG_ALLOC_MEM_DF and_CRTDBG_LEAK_CHECK_DF即可

    1 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    例1:

     1 #define _CRTDBG_MAP_ALLOC   
     2 #include <stdlib.h>  
     3 #include <crtdbg.h>  
     4   
     5 int main()  
     6 {  
     7     int *p = (int*)malloc(100);  
     8     _CrtDumpMemoryLeaks();//退出前检查一下内存泄露情况  
     9     return 0;  
    10 }  

     ①内存泄露的位置,双击到达相关代码。

     ②内存的类型,可以为normal, client, crt。

     ③泄露内存大小,这里泄露了100。

     注意:利用new的分配内存,定义下面的宏,以便显示内存泄露的具体位置。

    1 #ifdef _DEBUG  
    2    #ifndef DBG_NEW  
    3       #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )  
    4       #define new DBG_NEW  
    5    #endif  
    6 #endif  // _DEBUG  


    例2:

     1 #define _CRTDBG_MAP_ALLOC   
     2 #include <stdlib.h>  
     3 #include <crtdbg.h>  
     4   
     5 #ifdef _DEBUG  
     6    #ifndef DBG_NEW  
     7       #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )  
     8       #define new DBG_NEW  
     9    #endif  
    10 #endif  // _DEBUG  
    11   
    12 int main()  
    13 {  
    14     //程序退出前检查内存泄露。  
    15     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );  
    16     int *p = new int(0);  
    17     return 0;  
    18 }  

    二、在分配内存序号下断点

    1、在程序的开头设置断点,然后f5运行程序。

    2、在程序中断的时候,打开监视窗口。

    3、如果运行库是/MDd输入_crtBreakaAlloc。否则是/MTd输入{,,msvcr90d.dll}_crtBreakAlloc(vs2010是{,,msvcr100d.dll}_crtBreakAlloc其他版本类推),

    默认没下断点是-1,这里我们修改,设置在分配序号52内存块下断点(记得回车,变红色才是修改成功)。

    4、继续运行,下断成功。

    参考资料:http://msdn.microsoft.com/en-us/library/x98tx3cf%28v=vs.90%29.aspx

  • 相关阅读:
    《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
    .NET Core中文分词组件jieba.NET Core
    .NET Core 2.0及.NET Standard 2.0
    Visual Studio 2017 通过SSH 调试Linux 上.NET Core
    Visual Studio 2017 ASP.NET Core开发
    Visual Studio 2017正式版离线安装及介绍
    在.NET Core 上运行的 WordPress
    IT人员如何开好站立会议
    puppeteer(二)操作实例——新Web自动化工具更轻巧更简单
    puppeteer(一)环境搭建——新Web自动化工具(同selenium)
  • 原文地址:https://www.cnblogs.com/wangchengfeng/p/3440143.html
Copyright © 2011-2022 走看看