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中看到它的日志,但我没有看到内存泄漏.
问题:
如果我找不到合适的实用程序,我仍然需要依靠自己的内存管理器(完美地完成它).
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 行之后定义的。