代码之家  ›  专栏  ›  技术社区  ›  Moo-Juice

_ crtsetallochook从不显示文件名/行号

  •  2
  • Moo-Juice  · 技术社区  · 14 年前

    我在我的应用程序中实现了一个内存跟踪器,这样,如果我有内存泄漏,我可以切换这个小家伙来找到它。

    一切都很好,除了我从未传递过文件名或行号。我要用什么标志 _CrtSetDbgFlag 或预处理器命令?

    在我运行了这个东西(裸奔)之后,它显示了26个未清理的分配,我很确定它们不是我,但不知道它们发生在哪里。

    事先谢谢!

    1 回复  |  直到 14 年前
        1
  •  3
  •   Hans Passant    14 年前

    <crtdbg.h> 头文件:

    #ifdef  _CRTDBG_MAP_ALLOC
    #define   malloc(s)             _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
    // etc...
    #endif
    

    请注意,重新定义现在如何调用另一个版本的malloc,该版本具有您要查找的文件和行号。很明显,要做到这一点,您必须定义crtdbg映射alloc并包含crtdb.h。最好在预编译头文件中这样做,这样您就可以合理地确定所有代码都将使用这些宏进行编译。

    这仍然不能保证你会得到这个信息。您的项目可能正在使用未使用它编译的.lib。另一个失败模式是DLL,它可能只是卸载 之前 生成泄漏报告。该dll的文件和行信息也将被卸载。

    诊断这些麻烦制造者是有退路的。泄漏报告有一行以块号开头的泄漏,显示在大括号内的起始处。只要在两次运行之间块号是稳定的,就可以在进行分配时强制调试程序中断。将此代码放在主方法中,或者放在早期执行的代码中的任何点上:

     _crtBreakAlloc = 42;   // Change the number
    
    推荐文章
    ell  ·  获取我的私钥
    7 年前