• 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
  • 相关阅读:
    php的基础知识(三)
    php的基础知识(二)
    css的基础用法(下)
    css的基础用法(上)
    Conceptual blockbusting--chap7 Kinds of blockbusters
    Conceptual blockbusting--chap6 Alternate thinking languages
    Conceptual blockbusting--chap5 Intellectual and Expressive blocks
    Conceptual blockbusting--chap4 Cultural and Environmental blocks
    Conceptual blockbusting
    Conceptual blockbusting- chap2 perceptual blocks
  • 原文地址:https://www.cnblogs.com/GnagWang/p/1696545.html
Copyright © 2020-2023  润新知