【问题标题】:What is the usage of DEBUG_NEW and __FILE__?DEBUG_NEW 和 __FILE__ 的用途是什么?
【发布时间】:2011-03-24 15:41:38
【问题描述】:

我看到了以下宏,

#ifdef _DEBUG
#define new DEBUG_NEW
#UNDEF THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

上面的宏有什么用?

谢谢

【问题讨论】:

  • 在编译时这是否仍然相关,例如VS2017?我的旧代码中有这个,想知道它是否可以删除。

标签: c++


【解决方案1】:

DEBUG_NEW 只是一个 MACRO,通常定义为:

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

这样无论您在哪里使用new,它都可以跟踪文件和行号,这些文件和行号可用于定位程序中的内存泄漏。

__FILE____LINE__predefined macros,它们分别计算出您使用它们的文件名和行号!

阅读以下文章,它非常漂亮地解释了将 DEBUG_NEW 与其他有趣的宏一起使用的技术:

A Cross-Platform Memory Leak Detector


来自Wikpedia

Debug_new 指的是 C++ 中的一种技术 重载和/或重新定义运算符 new 和 operator delete 以 拦截内存分配和 释放调用,从而调试一个 内存使用程序。 经常 涉及定义一个名为 DEBUG_NEW,并使新成为 新的东西(_FILE_, _LINE_) 记录文件/行信息 分配。 Microsoft Visual C++ 使用 这种技术在其微软 基础班。有一些 扩展此方法的方法以避免 仍然使用宏重新定义 能够显示文件/行 一些平台上的信息。那里 对此有许多固有的限制 方法。它仅适用于 C++,并且 无法捕获 C 的内存泄漏 malloc 之类的函数。然而,它可以 使用起来非常简单,也非常 快,与其他一些相比 完整的内存调试器解决方案。

【讨论】:

    【解决方案2】:

    _DEBUG 是一个任意命名但经常选择的命令行符号,表示应编译额外的代码和对程序调试的支持。这通常会导致额外的检查以帮助隔离编程缺陷,或导致额外的消息为了开发者的利益而输出。

    DEBUG_NEW 不清楚,但它可能是new() 的别名,它执行与new()delete() 相关的额外验证。

    __FILE__ 是一个内置的预处理器符号,它计算出正在编译的模块的文件名。例如“MyProgram.cc”。

    【讨论】:

      【解决方案3】:

      __FILE__ 的一个常见用法是设计错误记录功能。您可以同时使用__FILE____LINE__ 来报告发生错误的确切源代码位置。

      我设计了异常库和assert()-type 函数来记录这些信息。 here 记录了这样一种用途。

      编辑:另一个例子here

      【讨论】:

        【解决方案4】:

        如果您实际上不使用它,我建议您删除该代码,因为它与 operator new 的其他合法重载冲突。

        查看这里的讨论:

        Is there a way to automatically have a #define reproduced in each source file

        【讨论】:

          【解决方案5】:

          通常,makroses 和预处理器命令的这种组合用于 MFC 项目,以跟踪内存泄漏。它必须包含在您的源文件中,字面意思是:

          #ifdef _DEBUG#endif 之间的所有内容仅在编译器的调试模式下执行。

          字符串:#define new DEBUG_NEW,表示每当你在代码中使用operator new时,它都会被宏DEBUG_NEW替换。然后,当您进行对象转储时,DEBUG_NEW 将允许您查明内存泄漏的来源。

          字符串:#UNDEF THIS_FILEstatic char THIS_FILE[] = __FILE__; - 重新定义 THIS_FILE 的含义并记住当前文件名和行号。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-03
            • 2014-08-18
            • 2012-04-17
            • 2014-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多