3

我正在尝试使用 CRT 内存泄漏检测,但在 Microsoft Visual Studio 中不断收到以下消息:“检测到内存泄漏 - 跳过对象转储。” 我永远无法让它实际执行和对象转储。

我按照微软关于内存泄漏检测的文章 ( http://msdn.microsoft.com/en-us/library/e5ewb1h3(VS.80).aspx ) 中的说明进行操作,但没有成功。

在我的 stdafx.h 我有(重建整个项目):

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

在我的应用程序的入口点,我有:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

我也希望它会以微软宣传的格式显示文件名和行号:

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.

虽然我什至无法获得对象转储,但我注意到其他人说他们看到了这些方面的东西(即使定义了 _CRTDBG_MAP_ALLOC ):

Detected memory leaks!
Dumping objects ->
{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.

我真的不想花时间覆盖 new 和 delete 运算符,所以我希望 CRT 调试能帮助我。如果这不起作用,我可能最终会覆盖 new 和 delete 运算符,但我真的想获得带有文件名和行号的分配信息(交叉手指)。

谢谢,基里尔

4

3 回答 3

2

在使用 _CrtDumpMemoryLeaks 方法获得大量没有文件名/行号的泄漏对象后,我刚刚使用了Visual Leak Detector 。VLD 像宣传的那样工作(它是免费的),我对此非常满意。

于 2011-03-22T00:45:14.713 回答
1

我的机器上没有它,但是当您安装 MSVC 时,您可以选择为 C 运行时库(即 MSVCRTxx.xxx)安装(大部分)源代码。如果您在该源代码中查找“跳过对象转储”,那么您可能能够弄清楚为什么要跳过对象转储。

于 2009-01-08T00:26:06.347 回答
1

打印文件名和行的原因是因为分配是使用通过的new宏完成的__FILE____LINE__.如果您不想 touch new,您将不会传递__FILE__and__LINE__到 CRT 并且它将无法打印。这里没有什么大魔法,真的。

于 2009-01-08T11:52:50.967 回答