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

时间:2015-06-03 11:54:20

标签: c++ visual-studio visual-studio-2012 memory-leaks crtdbg.h

我想检查程序是否有内存泄漏,找到了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去行也不行。

你能帮我吗?

3 个答案:

答案 0 :(得分: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文件中。

答案 1 :(得分:0)

看起来顶部的VS2013文档示例中存在拼写错误。它应该是:

#define _CRTDBG_MAP_ALLOC

请注意前导下划线。 VS2005 / 2008文档稍后使用_CRTDBG_MAP_ALLOC和VS2013文档引用_CRTDBG_MAP_ALLOC

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

  • 确保您处于Debug build
  • 清理/重建您的应用程序
  • 如果您使用预编译的标头,请确保将_CRTDBG_MAP_ALLOC定义添加到stdafx.h

答案 2 :(得分:0)

我希望这有帮助,如果你没有想出@ 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; 
}