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

新手上路,请多包涵

我想使用标准实用程序在我的应用程序中查找内存泄漏。以前我使用自己的内存分配器,但其他人(是的,你 AlienFluid)建议使用 Microsoft 的 Application Verifier,但我似乎无法让它报告我的泄漏。我有以下简单的应用程序:

 #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;
}

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

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

 cl /c /EHsc /Zi /Od /MDd test.cpp
link /debug test.obj

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

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

问题:

  • 为什么应用程序验证程序不报告泄漏?
  • 或者应用程序验证器不是真的打算找到泄漏吗?
  • 如果不是哪些其他工具可用于在应用程序结束时清楚地报告泄漏(即不是通过定期拍摄快照并比较它们,因为这在占用 1GB 或更多的应用程序中是不可能的),包括分配位置(所以不是 CRT 末尾的简单泄漏报告)

如果我没有找到一个像样的实用程序,我仍然必须依靠我自己的内存管理器(它做得很好)。

原文由 Patrick 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

// debug_new.h
#pragma 一次

#include "crtdbg.h"

#ifdef _DEBUG
#ifndef DEBUG_NEW
#define DEBUG_NEW 新(_NORMAL_BLOCK,__FILE__,__LINE__)
#万一
#万一

所有 .cpp 文件:

#include “debug_new.h”

...

// 在所有其他包含行之后:
#ifdef _DEBUG
#define new DEBUG_NEW
#万一

...

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

 _CrtSetDbgFlag( _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);

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

#ifdef _DEBUG
#define new DEBUG_NEW
#万一

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

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

原文由 Alex F 发布,翻译遵循 CC BY-SA 3.0 许可协议

应用程序验证程序仅捕获 DLL 中的泄漏。尝试阅读泄漏复选框中的工具提示。这就是它所说的。

原文由 Wanderley Caloni 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题