2017-08-09 109 views
0

我使用Visual 2017年写一个MFC应用程序应用程序退出时在调试模式下,我得到这个:检测内存泄漏

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

因此,为了知道哪些功能是造成泄漏,我已在stdafx.h中这些行:

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

而且这些线路中的CWinApp :: InitInstance中():

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetBreakAlloc(74); 

虽然它没有工作。我怀疑第74个内存分配号码是在我的代码执行之前完成的。我可以重载哪种方法以确保首先被调用?

+0

它总是74吗? – drescherjm

+0

是的,它总是74.我发现内存泄漏发生在我导入到我的项目中的非MFC代码中。虽然,我猜_CrtSetDbgFlag不会在此代码执行之前调用。 –

+0

我将这些行放在外部代码主类的构造函数中,并且调试器在堆栈(而不是堆)上分配std :: vector时停止。很奇怪...... –

回答

2

步入你的应用程序开始调试(这是一步,不运行,所以你会在程序中的任何内容运行之前停止在调试器中),然后将_crtBreakAlloc设置为你想要停止的分配(74) 。然后运行,你应该在第74次分配中休息一下。 CRT Debug Heap Details有关于这个变量的信息。

+0

我做到了,但调试器在程序结束之前没有中断。但是我想知道一些事情:因为我在CWinApp :: InitInstance()中调用了_CrtSetDbgFlag,堆检测已经被激活得太晚了,你不觉得吗? –

+0

@MarkMorrisson正确。当您调用_CrtSetBreakAlloc时,或者第74次分配已经发生,或者您的程序永远不会达到第74次分配。 – 1201ProgramAlarm

+0

那么,我能做什么? –

0

编写这些代码

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
在每个实现(.CPP)文件的顶部

,可以帮助您检测内存泄漏的根源。 另请参阅:How to detect memory leaks in MFC

+0

因为我在我的项目中包含很多外部文件,所以我在stdafx.h(通常包含在每个源文件中)的末尾添加了这些行,但效果并不理想。 –