1. VLD简介

Visual Leak Detector是一个免费的,强大的,开源的,可视化C ++内存泄漏检测工具。

VLD容易使用。安装后,只需告诉Visual C ++在哪里可以找到包含的头文件和库文件。然后,只需将以下行添加到代码中,即可将其与任何C/C++项目一起使用:

#include <vld.h>

在Visual Studio调试器下运行程序时,Visual Leak Detector将在以下位置输出内存泄漏报告:调试会话结束。泄漏报告包括完整的调用堆栈,该堆栈显示了如何分配泄漏的内存块。双击调用堆栈中的一行以跳转到该文件,然后在编辑器窗口中一行。

这是在C/C++应用程序中快速诊断和修复内存泄漏的非常有效的方法。

2. VLD安装

2.1官网地址:https://archive.codeplex.com/?p=vld

2.2下载地址:https://github.com/KindDragon/vld/releases/download/v2.5.1/vld-2.5.1-setup.exe

2.3安装VLD:一般会默认安装在"C:\Program Files (x86)\Visual Leak Detector"目录下

2.4安装过程中默认把VLD的头文件和库的目录添加到VC项目中

3. VC项目中配置VLD

3.1属性-C/C++-常规-附加包含目录,检查VC项目是否包含了VLD的头文件目录,如果没有则添加

3.2属性-链接器-常规-附加库目录,检查VC项目是否包含了VLD的库目录,如果没有则添加

3.3添加vld.lib

属性-C/C++-输入-附加依赖项添加vld.lib

3.4在每个分配的内存的文件里添加#include "vld.h"

3.5如果源文件太多,手工添加#include "vld.h"太麻烦,可以使用下面的脚本来添加

#!/usr/bin/perl
if($#ARGV < 0){
  print "the arguments is too few!!\n";
}
print "dir ",@ARGV;
my $indir = $ARGV[0];
#
#&replace_text("test.txt");
&find_fileindir("$indir");

sub find_fileindir(){
  local($dir) = @_;
  opendir(DIR,"$dir"|| die "can't open this $dir");
  local @files =readdir(DIR);
  closedir(DIR);
  for $file (@files){
    next if($file=~/\.$/ || $file =~/\.\.$/);

    if(-d "$dir/$file"){
        find_fileindir("$dir/$file");
    }elsif($file=~/.cpp$/ || $file=~/.c$/){
        print "replace $dir/$file\n";
        &replace_text("$dir/$file");
    }
  }
}

sub replace_text(){
  local($filename) = @_;
  open(DATA,"<$filename") or die "无法打开数据";
  @lines = <DATA>;
  $_=join "", @lines;
  #print $_;
  close(DATA);

  if($_ !~ /#include "vld.h"/){
    s/^/#include "vld.h"\n/;
  }else{
    print "the file has been replaced, skip it.\n";
  }
  

  #print $_;

  open(DATA2,">$filename") or die "无法打开数据";
  print DATA2 $_;
  close(DATA2);
}

运行该脚本perl readdir.pl <目录>,.cpp和.c文件将会自己添加#include "vld.h"。如果项目的头文件也有分配内存的地方,那么将脚本的第22行改成}elsif($file=~/\.cpp$/ || $file=~/\.c$|| $file=~/\.h$/){

4. 检测内存泄露

4.1选择debug模式

4.2 按CTRL+F5运行,程序结束时输出窗口将打印检查报告,如图

在输出窗口也可以看到同样的输出信息。

5.输出到文件

如果要想把产生的日志保存到文件中,需要将vld.ini(VLD安装目录下)复制到可执行文件的目录下,然后作如下修改:

ReportFile =.\memory_leak_report.txt

ReportTo = both

重新运行即可生成检查报告

6. 注意事项

6.1VLD只在debug版本有效,不要在release版本测试

6.2 如果有include"stdafx.h",则include <vld.h>放在其后,否则放在最前面

6.3 不要在QT中使用VLD,QT控件分配内存比较特殊

6.4VLD有一类内存泄露检查不出来,给指针分配了数组内存,但是释放的时候忘了加[], 如下:

    int *p = new int[10];

    delete p;

7.总结

VLD是一款非常优秀的内存泄露检查工具,程序在移植之前就先检查一下内存泄露问题,将会提高工作效率,减少麻烦!VLD是windows下的内存检测工作,后面我会介绍更强大的工具AddressSanitizer.

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐