c++内存泄露工具

简述

C/C++ 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏。如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的 - 从性能下降到内存耗尽,甚至会影响其他程序的正常运行。

VLD

VLD(Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具。相比较其它内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点:

  • 可以得到内存泄漏点的调用堆栈,如果可以的话,还能得到其所在文件及行号;
  • 可以得到泄露内存的完整数据;
  • 可以设置内存泄露报告的级别;
  • 它是一个已经打包的 lib,使用时无须编译源码。对于使用者自己的代码,只需要做很小的改动;
  • 源码使用 GNU 许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。

可见,VLD 简单易用。只需要做很小的改动(添加库并包含头文件),然后正常运行自己的程序,就可以发现内存问题;如果深入源码,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理及内存操作的常用技巧等。

下载、安装

VLD 主页:http://vld.codeplex.com/

这里写图片描述

进入主页后,点击【download】按钮进行下载 VLD 最新版本,或者在“DOWNLOADS”页面查找其它更多版本。

下载完成后,进行安装(傻瓜式 - 下一步)。

安装后的文件夹中主要包括:

  • bin:包含 dbghelp.dll、vld_x86.dll 文件
  • include:包含 vld.h、vld_def.h 文件
  • lib:包含 vld.lib 文件

使用

Visual Studio

新建一个 Win32 控制台应用程序,添加如下代码:


    
    
  1. #include "stdafx.h"
  2. #include "vld.h"
  3. int _tmain( int argc, _TCHAR* argv[])
  4. {
  5. char *pBuf = new char[ 200];
  6. return 0;
  7. }

配置项目:

  • C/C++ -> 常规 -> 附加包含目录:D:\Program Files\Visual Leak Detector\include
  • 链接 -> 常规 -> 附加库目录:D:\Program Files\Visual Leak Detector\lib\Win32

在 Debug 模式下运行,将会输出如下信息:

这里写图片描述

报告列出了内存泄露是在第几块、所在的地址、泄露的字节、调用的堆栈、内存内容。双击调用堆栈可以跳转到所在行。

Qt

新建一个 Qt Console Application,在 .pro 文件中添加如下内容:


    
    
  1. # 只有在 Win32 下才可使用
  2. win32 {
  3. CONFIG(debug, debug|release) { # 需要基于 Debug 模式
  4. DEFINES += VLD_MODULE
  5. VLD_PATH = "D:/Program Files/Visual Leak Detector"
  6. INCLUDEPATH += $<span class="hljs-variable">${VLD_PATH}/include
  7. LIBS += -L$<span class="hljs-variable">${VLD_PATH}/lib/W in32 -lvld
  8. }
  9. }

main.cpp 文件如下所示:


    
    
  1. #include <QCoreApplication>
  2. // 添加 VLD 头文件
  3. #ifdef VLD_MODULE
  4. #include "vld.h"
  5. #endif
  6. int main( int argc, char *argv[])
  7. {
  8. QCoreApplication a(argc, argv);
  9. char *pBuf = new char[ 200];
  10. return a.exec();
  11. }

编译运行,在 Qt Creator 的应用程序输出窗口中将会出现和 Visual Studio 中类似的内存泄露信息。

使用 VLD 检测内存泄露很容易,但在使用过程中,需要注意以下几点:

  1. 需要在 Debug 模式下使用。如果是 Release 模式,则不会链接 VLD。
  2. 只能使用 VC++ 编译器。这也是美中不足的一点,如果使用 Qt,只能先使用 VC++ 编译器捕捉并解决内存泄露,再考虑使用 mingw(gcc/g++)编译程序。

更多参考


版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣、好玩、靠谱。。。作者:一去丶二三里 博客地址: http://blog.csdn.net/liang19890820 http://blog.csdn.net/u011012932/article/details/52789085


简述

C/C++ 程序越复杂,内存的管理显得越重要,稍有不慎就会出现泄漏。如果内存泄漏不是很严重,在短时间内对程序不会有太大影响,这也使得内存泄漏问题有很强的隐蔽性,不易被发现。然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的 - 从性能下降到内存耗尽,甚至会影响其他程序的正常运行。

VLD

VLD(Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具。相比较其它内存泄露检测工具,它在检测到内存泄漏的同时,还具有如下特点:

  • 可以得到内存泄漏点的调用堆栈,如果可以的话,还能得到其所在文件及行号;
  • 可以得到泄露内存的完整数据;
  • 可以设置内存泄露报告的级别;
  • 它是一个已经打包的 lib,使用时无须编译源码。对于使用者自己的代码,只需要做很小的改动;
  • 源码使用 GNU 许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。

可见,VLD 简单易用。只需要做很小的改动(添加库并包含头文件),然后正常运行自己的程序,就可以发现内存问题;如果深入源码,可以学习到堆内存分配与释放的原理、内存泄漏检测的原理及内存操作的常用技巧等。

下载、安装

VLD 主页:http://vld.codeplex.com/

这里写图片描述

进入主页后,点击【download】按钮进行下载 VLD 最新版本,或者在“DOWNLOADS”页面查找其它更多版本。

下载完成后,进行安装(傻瓜式 - 下一步)。

安装后的文件夹中主要包括:

  • bin:包含 dbghelp.dll、vld_x86.dll 文件
  • include:包含 vld.h、vld_def.h 文件
  • lib:包含 vld.lib 文件

使用

Visual Studio

新建一个 Win32 控制台应用程序,添加如下代码:


  
  
  1. #include "stdafx.h"
  2. #include "vld.h"
  3. int _tmain( int argc, _TCHAR* argv[])
  4. {
  5. char *pBuf = new char[ 200];
  6. return 0;
  7. }

配置项目:

  • C/C++ -> 常规 -> 附加包含目录:D:\Program Files\Visual Leak Detector\include
  • 链接 -> 常规 -> 附加库目录:D:\Program Files\Visual Leak Detector\lib\Win32

在 Debug 模式下运行,将会输出如下信息:

这里写图片描述

报告列出了内存泄露是在第几块、所在的地址、泄露的字节、调用的堆栈、内存内容。双击调用堆栈可以跳转到所在行。

Qt

新建一个 Qt Console Application,在 .pro 文件中添加如下内容:


  
  
  1. # 只有在 Win32 下才可使用
  2. win32 {
  3. CONFIG(debug, debug|release) { # 需要基于 Debug 模式
  4. DEFINES += VLD_MODULE
  5. VLD_PATH = "D:/Program Files/Visual Leak Detector"
  6. INCLUDEPATH += $<span class="hljs-variable">${VLD_PATH}/include
  7. LIBS += -L$<span class="hljs-variable">${VLD_PATH}/lib/W in32 -lvld
  8. }
  9. }

main.cpp 文件如下所示:


  
  
  1. #include <QCoreApplication>
  2. // 添加 VLD 头文件
  3. #ifdef VLD_MODULE
  4. #include "vld.h"
  5. #endif
  6. int main( int argc, char *argv[])
  7. {
  8. QCoreApplication a(argc, argv);
  9. char *pBuf = new char[ 200];
  10. return a.exec();
  11. }

编译运行,在 Qt Creator 的应用程序输出窗口中将会出现和 Visual Studio 中类似的内存泄露信息。

使用 VLD 检测内存泄露很容易,但在使用过程中,需要注意以下几点:

  1. 需要在 Debug 模式下使用。如果是 Release 模式,则不会链接 VLD。
  2. 只能使用 VC++ 编译器。这也是美中不足的一点,如果使用 Qt,只能先使用 VC++ 编译器捕捉并解决内存泄露,再考虑使用 mingw(gcc/g++)编译程序。

更多参考


版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣、好玩、靠谱。。。作者:一去丶二三里 博客地址: http://blog.csdn.net/liang19890820 http://blog.csdn.net/u011012932/article/details/52789085


猜你喜欢

转载自blog.csdn.net/li_jia_tu/article/details/81121632