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 的 sonarlint 扩展检测新引入的代码气味/泄漏
在 Visual C++ (Windows) 中检测内存泄漏