如何使用Application Verifier查找内存泄漏

Pat*_*ick 9 c++ windows memory-leaks application-verifier

我想使用标准实用程序在我的应用程序中找到内存泄漏.以前我使用自己的内存分配器,但其他人(是的,你AlienFluid)建议使用微软的应用程序验证程序,但我似乎无法报告我的泄漏.我有以下简单的应用程序:

#include <iostream>
#include <conio.h>

class X
   {
   public:
      X::X() : m_value(123) {}
   private:
      int m_value;
   };

void main()
{
X *p1 = 0;
X *p2 = 0;
X *p3 = 0;

p1 = new X();
p2 = new X();
p3 = new X();
delete p1;
delete p3;
}
Run Code Online (Sandbox Code Playgroud)

此测试显然包含内存泄漏:p2是新的但未删除.

我使用以下命令行构建可执行文件:

cl /c /EHsc /Zi /Od /MDd test.cpp
link /debug test.obj
Run Code Online (Sandbox Code Playgroud)

我下载了Application Verifier(4.0.0665)并启用了所有检查.

如果我现在运行我的测试应用程序,我可以在Application Verifier中看到它的日志,但我没有看到内存泄漏.

问题:

  • 为什么Application Verifier报告没有泄漏?
  • 或者不是Application Verifier真的打算找到漏洞吗?
  • 如果没有哪个其他工具可用于在应用程序结束时清楚地报告泄漏(即不是通过拍摄常规快照并进行比较,因为这在1GB或更多的应用程序中是不可能的),包括调用堆栈的分配地点(因此不是CRT结束时的简单泄漏报告)

如果我找不到合适的实用程序,我仍然需要依靠自己的内存管理器(完美地完成它).

Ale*_*x F 4

CRT内存泄漏检测(无堆栈跟踪):

//debug_new.h
#pragma 一次

#include“crtdbg.h”

#ifdef_DEBUG
#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#万一
#万一

所有 .cpp 文件:

#include“debug_new.h”

...

// 在所有其他包含行之后:
#ifdef_DEBUG
#定义新的DEBUG_NEW
#万一

...

在程序初始化代码中写入一次:

_CrtSetDbgFlag( _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
Run Code Online (Sandbox Code Playgroud)

在MFC中,所有这些都已经在MFC头文件中实现了。您只需确保每个 cpp 文件都包含以下行:

#ifdef_DEBUG
#定义新的DEBUG_NEW
#万一

限制:这仅捕获“新”内存泄漏,由其他函数(如 malloc)引起的所有泄漏都不会被捕获。

不要在 .h 文件内进行任何分配 - 它们将在没有源代码行的情况下打印,因为 DEBUG_NEW 是在所有 #include 行之后定义的。