8

我想检查我的程序是否存在内存泄漏,并找到了这篇 Microsoft 文章

我彻底遵循了这篇文章并添加了

#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 去排队也不起作用。

请你帮助我好吗?

4

3 回答 3

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定义()。也从这个答案确保#define您要检查的 cpp 文件中。

于 2015-06-03T12:01:19.790 回答
1

如果您还没有弄清楚@AD,我希望这会有所帮助,适用于 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; 
}
于 2016-07-27T12:26:08.423 回答
0

看起来顶部的 VS2013 文档示例中有错字。它应该是:

#define _CRTDBG_MAP_ALLOC

注意前导下划线。VS2005/2008 文档使用_CRTDBG_MAP_ALLOC,VS2013 文档_CRTDBG_MAP_ALLOC稍后参考。

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

  • 确保您处于调试版本中
  • 清理/重建您的应用程序
  • 如果您使用的是预编译头文件,请确保将_CRTDBG_MAP_ALLOC定义添加到stdafx.h
于 2015-06-03T11:59:12.400 回答