【发布时间】:2011-03-24 15:41:38
【问题描述】:
我看到了以下宏,
#ifdef _DEBUG
#define new DEBUG_NEW
#UNDEF THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
上面的宏有什么用?
谢谢
【问题讨论】:
-
在编译时这是否仍然相关,例如VS2017?我的旧代码中有这个,想知道它是否可以删除。
标签: c++
我看到了以下宏,
#ifdef _DEBUG
#define new DEBUG_NEW
#UNDEF THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
上面的宏有什么用?
谢谢
【问题讨论】:
标签: c++
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 之类的函数。然而,它可以 使用起来非常简单,也非常 快,与其他一些相比 完整的内存调试器解决方案。
【讨论】:
_DEBUG 是一个任意命名但经常选择的命令行符号,表示应编译额外的代码和对程序调试的支持。这通常会导致额外的检查以帮助隔离编程缺陷,或导致额外的消息为了开发者的利益而输出。
DEBUG_NEW 不清楚,但它可能是new() 的别名,它执行与new() 和delete() 相关的额外验证。
__FILE__ 是一个内置的预处理器符号,它计算出正在编译的模块的文件名。例如“MyProgram.cc”。
【讨论】:
如果您实际上不使用它,我建议您删除该代码,因为它与 operator new 的其他合法重载冲突。
查看这里的讨论:
Is there a way to automatically have a #define reproduced in each source file
【讨论】:
通常,makroses 和预处理器命令的这种组合用于 MFC 项目,以跟踪内存泄漏。它必须包含在您的源文件中,字面意思是:
#ifdef _DEBUG 和 #endif 之间的所有内容仅在编译器的调试模式下执行。
字符串:#define new DEBUG_NEW,表示每当你在代码中使用operator new时,它都会被宏DEBUG_NEW替换。然后,当您进行对象转储时,DEBUG_NEW 将允许您查明内存泄漏的来源。
字符串:#UNDEF THIS_FILE 和 static char THIS_FILE[] = __FILE__; - 重新定义 THIS_FILE 的含义并记住当前文件名和行号。
【讨论】: