zoukankan      html  css  js  c++  java
  • C++代码中的内存泄漏检查如何做?(一)

    我们的代码里会有很多的内存泄漏,如何快速的定位和修复这些内存的泄漏是一项非常重要的技能,在这里分享一下如何从开发的代码里找到这种问题。

    常见的C++程序分为两大类:MFC和Win32。先看第一种MFC程序如何找内存泄漏的问题。

    MFC程序比较容易一些,因为它已经提供了这个功能,我们新建一个MFC的工程,我们在看到每一个CPP文件里面都有这样一句:

       1: #ifdef _DEBUG
       2: #define new DEBUG_NEW
       3: #endif

    DEBUG_NEW 这个宏定义在afx.h文件中,就是它帮助我们定位内存泄漏。

    在含有以上代码的cpp文件中分配内存后假如没有进行释放,那么停止程序的时候,VisualStudio的Output窗口就会显示一些提示的信息了,试一下:在里面加一句

    int* p = new int;

    然后调试工程,运行结束后你会看到在Output窗口里输出了

       1: Detected memory leaks!
       2: Dumping objects ->
       3: e:\学习\de\de\de.cpp(20) : {290} normal block at 0x004CD7F8, 4 bytes long.
       4:  Data: <    > CD CD CD CD 
       5: Object dump complete.
       6: The program '[11088] de.exe: Native' has exited with code 0 (0x0).

    告诉我们在20行有内存泄漏,双击这双就会跳到相应的代码行,是不是很方便啊!

     

    下来再看一下Win32工程如何找到内存泄漏:

    我试了下用VisualStudio建立的Win32 Console Application和Win32 Project项目,结果都不能检测出内存泄露。

    所以我们需要找到如何让VS帮我发现问题的方法。查询了MSDN后,发现有个叫Debug Routines的东东。首先,我们需要知道C运行库的Debug版本提供了许多检测功能,使得我们更容易的Debug程序。

    我们将会使用到里面很重要的几个函数。其中最重要的是 _CrtDumpMemoryLeaks使用这个函数,需要包含头文件crtdbg.h

    该函数只在Debug版本才有用,当在调试器下运行程序时,_CrtDumpMemoryLeaks 将在“Output(输出)”窗口中显示内存泄漏信息.写段代码试验一下吧,如下:

    1

    这个就会在Output窗口输出如下信息:

    2

    虽然输出了有内存泄漏,但是无法看出是那里泄漏了,然后下来看看我们的第二个版本的代码:

    3

    它会在Output输出:

    4

    已经很清楚我告诉我们是在17行产生的。

    然后我们把代码修改正确:

       1: int _tmain(int argc, _TCHAR* argv[])
       2: {
       3:     int* p = new int;
       4:     delete p;
       5:     _CrtDumpMemoryLeaks();
       6:     return 0;
       7: }

    运行后,输出的信息就是正确的了。

    所以在写代码的时候除了在产生Dump信息外,最重要的就是在程序退出的时候需要掉用一次_CrtDumpMemoryLeaks();

    假如程序有不止一个出口,那么我们就需要在多个地方都调用该函数。

     

     


    作者:GangWang
    出处:http://www.cnblogs.com/GnagWang/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    December 23rd 2016 Week 52nd Friday
    December 22nd 2016 Week 52nd Thursday
    December 21st 2016 Week 52nd Wednesday
    December 20th 2016 Week 52nd Tuesday
    December 19th 2016 Week 52nd Sunday
    December 18th 2016 Week 52nd Sunday
    uva294(唯一分解定理)
    uva11624Fire!(bfs)
    fzu2150Fire Game(双起点bfs)
    poj3276Face The Right Way
  • 原文地址:https://www.cnblogs.com/GnagWang/p/1696545.html
Copyright © 2011-2022 走看看