C++ _CRTDBG_映射_ALLOC不显示文件名

C++ _CRTDBG_映射_ALLOC不显示文件名,c++,debugging,memory-leaks,crtdbg.h,C++,Debugging,Memory Leaks,Crtdbg.h,我正在尝试检测内存泄漏,并使用make_CRTDBG_MAP_ALLOC宏来定位泄漏区域的位置。因此,我定义宏如下所示: #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) #define new DEBUG_NEW #endif

我正在尝试检测内存泄漏,并使用make_CRTDBG_MAP_ALLOC宏来定位泄漏区域的位置。因此,我定义宏如下所示:

#ifdef _DEBUG
    #define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
    #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
    #define new DEBUG_NEW
#endif
(感谢Tushar Jadhav:)

但输出显示如下内容:

Detected memory leaks!
Dumping objects ->
{124058} normal block at 0x0000000031DED080, 24 bytes long.
 Data: < 0      ` $     > C8 30 F7 EF FE 07 00 00 60 D2 24 1D 00 00 00 00 
检测到内存泄漏!
转储对象->
0x0000000031DED080处的{124058}正常块,24字节长。
数据:<0`$>C8 30 F7 EF FE 07 00 60 D2 24 1D 00 00
而不是像这样:

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
检测到内存泄漏!
转储对象->
C:\ProgramFiles\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20):{18}
0x00780E80处的正常块,64字节长。
数据:<>光盘
对象转储完成。

那么,我如何才能让它显示泄漏的文件名和位置呢?

似乎只有在cpp文件中打开CRT时才会显示泄漏的行。

在我的例子中,我最终将线程中的内容包含到代码中。这将覆盖
new
操作符,并将文件名和行号包含在其中以供以后打印。不确定这是否仅适用于Visual Studio

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
\define\u CRTDBG\u MAP\u ALLOC
#包括
#ifdef_调试
#定义调试\新建(\正常\块、\文件、\行)
#定义新调试\u新
#恩迪夫
引用源的整个测试代码为:

#define _CRTDBG_MAP_ALLOC
#include<iostream>
#include <crtdbg.h>
#ifdef _DEBUG
    #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
    #define new DEBUG_NEW
#endif

int main() 
{
    char *a = new char[10];
    _CrtDumpMemoryLeaks();
    return 0; 
}
\define\u CRTDBG\u MAP\u ALLOC
#包括
#包括
#ifdef_调试
#定义调试\新建(\正常\块、\文件、\行)
#定义新调试\u新
#恩迪夫
int main()
{
char*a=新字符[10];
_CrtDumpMemoryLeaks();
返回0;
}
在我的测试用例中打印:

Detected memory leaks!
Dumping objects ->
e:\test\testapplication\testapplication.cpp(11) : {144} normal block at 0x007F4EF0, 10 bytes long.
 Data: <          > CD CD CD CD CD CD CD CD CD CD 
Object dump complete.
检测到内存泄漏!
转储对象->
e:\test\testapplication\testapplication.cpp(11):{144}0x007F4EF0处的正常块,10字节长。
数据:<>光盘
对象转储完成。

分配的代码没有使用有效的#定义进行编译。可以位于一个库中,可以在一个DLL中像预构建的C++模板类专业。或者在生成泄漏报告之前卸载了包含代码的DLL。@HansPassant那么你是说泄漏的不是我的“可疑代码”本身;在“可疑代码”中调用的是一些代码/二进制代码/DLL?我要说的是,这些代码可能在任何地方都找不到。通常的泄漏问题,不是吗?如果你能让{brages}之间的数字重复,那么就把{crtBreakAlloc设置为这个数字。有没有一种快速的方法可以在所有文件中打开CRT,而不必,例如,创建一个包含定义的新头并将其包含在所有地方?附议阿奎德乌尔的问题:我的软件中的所有代码看起来都是从“stdafx.h”开始的所以我在“TODO”注释后添加了这三行,并重新构建了它。这还不够<代码>//TODO:在此处引用程序所需的其他标题
\define\u CRTDBG\u MAP\u ALLOC
\include
\include>
Detected memory leaks!
Dumping objects ->
e:\test\testapplication\testapplication.cpp(11) : {144} normal block at 0x007F4EF0, 10 bytes long.
 Data: <          > CD CD CD CD CD CD CD CD CD CD 
Object dump complete.