代码之家  ›  专栏  ›  技术社区  ›  Kiril

Visual Studio_CrtDumpMemoryLeaks始终跳过对象转储

  •  3
  • Kiril  · 技术社区  · 16 年前

    我正在尝试使用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.
    

    虽然我从来没能得到一个对象转储,但我注意到其他人说他们看到的东西沿着这些线(即使定义了“映射分配”):

    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.
    

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

    谢谢, 基里尔

    3 回复  |  直到 16 年前
        1
  •  1
  •   ChrisW    16 年前

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

        2
  •  2
  •   Jared Updike    13 年前

    我刚刚用过 Visual Leak Detector 使用c crtdumpmemoryleaks方法获取大量没有文件名/行号的泄漏对象后。VLD像广告上那样工作(免费),我对此很满意。

        3
  •  1
  •   MSalters    16 年前

    打印文件名和行的原因是使用 new 通过的宏 __FILE__ __LINE__. 如果你不想触摸 新的 你不会路过的 一个文件 __LINE__ 在CRT上,它将无法打印。这里没有什么大魔术,真的。