gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:43:20 24 4
gpt4 key购买 nike

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

#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 不报告泄漏?
  • 或者 Application Verifier 真的不是用来查找漏洞的吗?
  • 如果没有哪些其他工具可用于在应用程序结束时清楚地报告泄漏(即不是通过定期拍摄快照并比较它们,因为这在占用 1GB 或更多内存的应用程序中是不可能的),包括调用分配位置的堆栈(因此不是 CRT 末尾的简单泄漏报告)

如果我找不到像样的实用程序,我仍然必须依赖我自己的内存管理器(它做得很完美)。

最佳答案

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

// debug_new.h#pragma once#include "crtdbg.h"#ifdef _DEBUG#ifndef DEBUG_NEW#define DEBUG_NEW   new( _NORMAL_BLOCK, __FILE__, __LINE__)#endif#endif

All .cpp files:

#include "debug_new.h"...// After all other include lines:#ifdef _DEBUG#define new DEBUG_NEW#endif...

Write this once in the program initialization code:

_CrtSetDbgFlag( _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);

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

#ifdef _DEBUG#define new DEBUG_NEW#endif

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

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

关于c++ - 如何使用 Application Verifier 查找内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2955858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com