zoukankan      html  css  js  c++  java
  • 使用Visual Leak Detector for Visual C++ 捕捉内存泄露

     

    什么是内存泄漏?

           内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

    CC++内存泄露

           对于C和C++这种没有Garbage Collection 的语言来讲,我们主要关注两种类型的内存泄漏:

           堆内存泄漏(Heap leak)。对内存指的是程序运行中根据需要通过malloc,realloc, new等从堆中分配的一块内存,完成后必须通过调用对应的 free或者delete 释放掉。如果程序设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak.

           系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,Handle,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。

    如何解决内存泄露?

            内存泄露的问题其困难在于:

           1、编译器不能发现这些问题。

           2、运行时才能捕获到这些错误,这些错误没有明显的症状,时隐时现。

           3、对于手机等终端开发用户来说,尤为困难。

           下面从三个方面来解决内存泄露:

           第一,良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。当程序稳定之后,再来检测内存泄露时,无疑增加了排除的难度和复杂度。

           使用了内存分配的函数,要记得要使用其释放函数释放掉。

           Heap memory

           malloc ealloc ------  free

           new ew[] ----------  delete delete[]

           GlobalAlloc------------GlobalFree

           Resource Leak :

           对于系统资源使用之前要仔细看其使用说明,防止错误使用或者忘记释放掉系统资源。

           对于基于引用计数的系统对象尤其要注意,因为只有其引用计数为0时,该对象才能正确被删除。而其使用过程中又生成的新的系统资源,使用完毕后,如果没有及时删除,都会影响其引用计数。

    使用Visual Leak Detector for Visual C++

           简介

           Visual Leak Detector是一款免费的、健全的、开源的Visual C++内存泄露检测系统。相比Visual C++自带的内存检测机制,Visual Leak Detector可以显示导致内存泄露的完整内存分配调用堆栈。

           使用方法

           VLD简单易用,文档也很丰富,对于内存泄露的具体位置也能以调用堆栈的形式详细的显示出来。

           下载安装后,仅仅需要告诉Visual C++在哪里找到include文件和lib文件。

             C/C++ -> General -> Additional Include Directories = C:Program Files (x86)Visual Leak Detectorinclude

             Linker -> General -> Additional Library Directories = C:Program Files (x86)Visual Leak DetectorlibWin32

             Linker -> Input-> Additional Dependencies = vld.lib

           然后,在代码上的变动就只需要简单的加上#include <vld.h> 就可以了。

           当你在Visual C++中调试运行你的程序时,在程序结束后VLD将在output窗口输出一个内存泄露报告,该报告包括了你的程序中内存分配的完成调用栈信息。双击调用栈的某一行,就可以迅速跳转到你的代码编辑器相应的位置。

           Visual Leak Detector有一些配置项,可以设置内存泄露报告的保存地(文件、调试器),拷贝"Visual Leak Detector"路径下的vld.ini文件到工程的Debug目录下(在IDE运行的话,则需要拷贝到工程目录下),修改以下项:

           ReportFile = .memory_leak_report.txt

           ReportTo = both

           可以看到在Debug目录下生成文件memory_leak_report.txt,跟VS中Output窗口输出的内容一样。

           总之,VLD是一种高效的诊断、修复C/C++程序内存泄露的方法。

          

           应用举例

     #include "stdafx.h"
     #ifdef _DEBUG    //在Release模式下,不会链接Visual Leak Detector
     #include "vld.h"
     #endif
      int _tmain(int argc, _TCHAR* argv[])
      {
            char* ch1 = new char[100];
            char* ch2 = (char*)malloc(200);
    
             /*
            if (ch1 != NULL)
            {
                  delete[] ch1;
                  ch1 = NULL;
            }
            if (ch2 != NULL)
            {
                  free(ch2);
                  ch1 = NULL;
            }
             */
    
            return 0;
       }

    Output输出

    Visual Leak Detector Version 2.2.3 installed.

    WARNING: Visual Leak Detector detected memory leaks!

    ---------- Block 1 at 0x008CD6F8: 100 bytes ----------

      Call Stack:

        c:users consoleapplicationconsoleapplication.cpp (12): ConsoleApplication.exe!wmain + 0x7 bytes

        f:ddvctoolscrt_bldself_x86crtsrccrtexe.c (533): ConsoleApplication.exe!__tmainCRTStartup + 0x19 bytes

        f:ddvctoolscrt_bldself_x86crtsrccrtexe.c (377): ConsoleApplication.exe!wmainCRTStartup

        0x74EE8543 (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0xE bytes

        0x770EAC69 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x85 bytes

        0x770EAC3C (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x58 bytes

      Data:

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD                                                  ........ ........

     

     

    ---------- Block 2 at 0x008CD798: 200 bytes ----------

      Call Stack:

        c:users consoleapplicationconsoleapplication.cpp (13): ConsoleApplication.exe!wmain + 0xD bytes

        f:ddvctoolscrt_bldself_x86crtsrccrtexe.c (533): ConsoleApplication.exe!__tmainCRTStartup + 0x19 bytes

        f:ddvctoolscrt_bldself_x86crtsrccrtexe.c (377): ConsoleApplication.exe!wmainCRTStartup

        0x74EE8543 (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0xE bytes

        0x770EAC69 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x85 bytes

        0x770EAC3C (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x58 bytes

      Data:

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD    CD CD CD CD    CD CD CD CD     ........ ........

        CD CD CD CD    CD CD CD CD                                   ........ ........

     

    Visual Leak Detector detected 2 memory leaks (372 bytes).

    Largest number used: 372 bytes.

    Total allocations: 372 bytes.

    Visual Leak Detector is now exiting.

    The program '[0x262C] ConsoleApplication1.exe' has exited with code 0 (0x0).

    输出的部分主要分为两块

           Call Stack部分:

           是泄露内存的调用堆栈,其中显示了泄露资源创建的位置,双击便可以定位到相应的代码部分。

           Data部分:

           即泄露部分的内存内容。

  • 相关阅读:
    Django Admin 日期字段格式化(转载)
    关于跨域请求和django处理跨域请求最佳解决方案的总结(转载)
    19.循环语句例题
    18.条件分支例题-道理:开发有两个要求:1能实现功能 2.代码最优
    17.循环语句-while循环 do while循环
    16.循环语句---for循环 for break 、for continue 、 for continue配合label写法
    15.条件?value1 : value2 三目运算符-判断语句
    14.switch case break 判断语句
    13.if 条件判断语句if 、if else
    12.经典计算题
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6214505.html
Copyright © 2011-2022 走看看