Visual Studio 内存泄漏检测不打印文件名和行号

Posted

技术标签:

【中文标题】Visual Studio 内存泄漏检测不打印文件名和行号【英文标题】:Visual Studio memory leak detection not printing file name and line number 【发布时间】:2015-06-03 11:54:20 【问题描述】:

我想检查我的程序是否有内存泄漏,发现this Microsoft article。

我彻底按照文章添加了

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

_CrtDumpMemoryLeaks();

程序退出时。

它会在我的输出窗口中正确转储所有内存泄漏信息,但问题是:

不打印内存泄漏所在的文件名和行号!

它在文章中说#define _CRTDBG_MAP_ALLOC 会打印文件名和行号,但它不适合我。

我的输出是这样的

Detected memory leaks!
Dumping objects ->
3456 normal block at 0x038F81E8, 560 bytes long.
 Data: <       A       B> 00 00 00 00 00 00 10 41 00 00 00 FF 00 00 E6 42 
3447 normal block at 0x038F8170, 56 bytes long.
 Data: < B    ^  B      > 80 42 90 03 10 02 5E 08 80 42 90 03 00 00 CD CD 
3440 normal block at 0x038F86B0, 840 bytes long.
 Data: <       A       B> 00 00 00 00 00 00 10 41 00 00 00 FF 00 00 A8 42 
...

所以我真的无法使用它...按 F4 转到该行也不起作用。

你能帮帮我吗?

【问题讨论】:

如果您有调试版本,请尝试在Application Verifier 下运行应用程序 【参考方案1】:

#define 错了。为了得到

的格式
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.

你需要使用:

#define _DEBUG 
#define _CRTDBG_MAP_ALLOC

您还必须包含 _DEBUG,因为 _CRTDBG_MAP_ALLOC 仅适用于已定义的 _DEBUG (source)。 同样从这个answer 确保#define 在您要检查的cpp 文件中。

【讨论】:

【参考方案2】:

如果您还没有弄清楚@A.D,我希望这会有所帮助,适用于 win32 应用程序,我们需要覆盖新的运算符。不幸的是,它不适用于 MFC 应用程序。:(

#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() 

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ) ;
char *a = new char[10];
return 0; 

【讨论】:

是的,它适用于像这样的简单程序,但甚至无法为我的 MFC/WTL 应用程序编译【参考方案3】:

顶部的 VS2013 文档示例中似乎有错字。应该是:

#define _CRTDBG_MAP_ALLOC

注意开头的下划线。 VS2005/2008 文档使用_CRTDBG_MAP_ALLOC,VS2013 文档稍后引用_CRTDBG_MAP_ALLOC

您可以检查的其他一些事项:

确保您处于调试版本中 清理/重建您的应用程序 如果您使用的是预编译头文件,请确保将_CRTDBG_MAP_ALLOC 定义添加到stdafx.h

【讨论】:

我也试过了,还是不显示文件名和行号

以上是关于Visual Studio 内存泄漏检测不打印文件名和行号的主要内容,如果未能解决你的问题,请参考以下文章

可以在 Visual Studio 的泄漏检测中隐藏安全的内存泄漏吗?

Visual Studio vc++的静态代码内存泄漏检测

如何使用 Visual Studio 的 sonarlint 扩展检测新引入的代码气味/泄漏

在 Visual C++ (Windows) 中检测内存泄漏

Visual Leak Detector配置项 SkipHeapFreeLeaks

Visual Leak Detector配置项 SkipCrtStartupLeaks