我正在使用Visual 2017编写MFC应用程序,当应用程序以调试模式退出时,我明白了:
检测到内存泄漏!转储对象 - > {74}正常阻挡在 0x00000230E49A7000,长度为16个字节。数据:< 0 0> 30 00 97 E4 30 02 00 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 :(得分:2)
进入你的应用程序以开始调试(这是步骤,而不是运行,所以你将在程序运行之前在调试器中停止),然后将_crtBreakAlloc
设置为你想要停止的分配(74)。然后跑,你应该在第74次分配中休息。 CRT Debug Heap Details包含有关此变量的信息。
This Microsoft support article还列出了在调试器中使用_crtBreakAlloc
的说明。
答案 1 :(得分:1)
编写此代码
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
在每个实现(.CPP)文件的顶部,可以帮助您检测内存泄漏的来源。 另见:How to detect memory leaks in MFC。