C++ MFC应用程序中的内存泄漏检测

C++ MFC应用程序中的内存泄漏检测,c++,memory-leaks,mfc,C++,Memory Leaks,Mfc,我正在使用Visual 2017编写一个MFC应用程序,当应用程序以调试模式退出时,我得到以下信息: 检测到内存泄漏!正在转储对象->{74}正常块 0x00000230E49A7000,16字节长。数据:30 00 97 E4 30 02 00 00 00对象转储完成 因此,为了知道是哪个函数导致了泄漏,我在stdafx.h中添加了以下行: #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h>

我正在使用Visual 2017编写一个MFC应用程序,当应用程序以调试模式退出时,我得到以下信息:

检测到内存泄漏!正在转储对象->{74}正常块 0x00000230E49A7000,16字节长。数据:30 00 97 E4 30 02 00 00 00对象转储完成

因此,为了知道是哪个函数导致了泄漏,我在stdafx.h中添加了以下行:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

尽管如此,它并没有起作用。我怀疑第74个内存分配号是在我的代码执行之前生成的。我可以重载哪个方法以确保首先被调用?

进入应用程序以开始调试(这是一个步骤,不是运行,因此在程序中的任何内容运行之前,您将在调试器中停止),然后将
\u crtBreakAlloc
设置为您希望在(74)处停止的分配。然后跑,你应该在第74次分配中得到休息。包含有关此变量的信息

还列出了在调试器中使用
\u crtBreakAlloc
的说明。

编写此代码

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
在每个实现(.CPP)文件的顶部,可以帮助您检测内存泄漏的来源。
另请参见:。

是否始终为74?是的,始终为74。我发现内存泄漏发生在我导入到项目中的非MFC代码中。不过,我猜在执行此代码之前不会调用_crtsetdbgfagflag。我将这些行放在外部代码的主类的构造函数中,当在堆栈(而不是堆)上分配std::vector时,调试器会停止。非常奇怪…堆栈上的std::vector请记住,向量可能在堆栈上,但它是从堆中分配的。可能泄漏报告是误报。我这样做了,但调试器在程序结束前没有中断。但我想知道的是:自从我在CWinApp::InitInstance()中调用了_crtsetdbgsflag之后,堆检测被激活得太晚了,你不认为吗?@markmorrison正确。当您调用_CrtSetBreakAlloc时,第74次分配已经发生,或者您的程序从未到达第74次分配。那么,我能做什么?请添加调用_CrtSetBreakAlloc(74)的说明;当处于断点时。我尝试了立即窗口,但它说
标识符“\u crtsetbreakaloc”未定义
@ScottHutchinson如果您使用
\u crtsetbreakaloc
函数在代码中设置中断计数。在调试器中,设置
\u crtBreakAlloc
全局变量。由于我在项目中包含许多外部文件,我在stdafx.h(通常由每个源文件包含)的末尾添加了这些行,但效果并不好。您不能将
\define new DEBUG\u new
添加到
stdafx.h
文件的底部。它必须位于每个
.cpp
文件中。
#ifdef _DEBUG
#define new DEBUG_NEW
#endif