我看到了跟随宏,
#ifdef _DEBUG
#define new DEBUG_NEW
#UNDEF THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
上述宏的用法是什么?
谢谢
答案 0 :(得分:7)
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,让新成为 像new(_ FILE _,_ LINE _) 记录文件/行信息 分配。 Microsoft Visual C ++使用 这种技术在微软 基础课程。有一些 扩展此方法以避免的方法 仍然使用宏重新定义 能够显示文件/行 某些平台上的信息。那里 这有很多固有的局限性 方法。它仅适用于C ++和 无法通过C捕获内存泄漏 像malloc这样的函数。但是,它可以 使用非常简单,而且非常简单 比较快一些 完整的内存调试解决方案。
答案 1 :(得分:1)
_DEBUG
是一个任意命名但经常被选择的命令行符号,表示应该编译额外的代码和调试程序的支持。通常这会导致额外的检查以帮助隔离编程缺陷或导致额外的为了开发人员的利益而输出的消息。
DEBUG_NEW
不清楚,但它可能是new()
的别名,它会对new()
和delete()
进行额外验证。
__FILE__
是一个内置的预处理程序符号,用于计算正在编译的模块的文件名。例如“MyProgram.cc”。
答案 2 :(得分:0)
__FILE__
的一个常见用法是设计错误记录功能。您可以同时使用__FILE__
和__LINE__
报告发生错误的确切源代码位置。
我设计了异常库和assert()
- 记录此信息的类型函数。一个这样的用法记录在案here。
编辑:另一个例子here
答案 3 :(得分:0)
如果您实际上没有使用它,我会建议您删除该代码,因为它与operator new的其他连续重载冲突。
见这里的讨论:
Is there a way to automatically have a #define reproduced in each source file
答案 4 :(得分:0)
通常,makroses和预处理器命令的这种组合在MFC项目中用于跟踪内存泄漏。它必须包含在您的源文件中,而升级意味着:
if (window.DOMParser)
{
parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlhttp.responseXML, "text/xml");
}
else // Internet Explorer
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(xmlhttp.responseXML);
}
和#ifdef _DEBUG
之间的所有内容仅在编译器的DEBUG模式下执行。
字符串:#endif
,表示无论何时在代码中使用operater new,它都将被宏#define new DEBUG_NEW
替换。然后,当您执行对象转储时,DEBUG_NEW
将允许您查明内存泄漏的来源。
字符串:DEBUG_NEW
和#UNDEF THIS_FILE
- 重新定义static char THIS_FILE[] = __FILE__;
的含义并记住当前的文件名和行号。