重新定义__LINE__和__FILE__常量

redefine __LINE__ and __FILE__ constants

本文关键字:LINE FILE 常量 新定义 定义      更新时间:2023-10-16

我正在为c ++制作一个内存泄漏检测器。它替换了全局 new 运算符,并使用宏初始化两个全局变量 __file____line__ ,如下所示:

#define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new

我从另一个我不记得名字的StackOverflow用户那里学到了这个技巧。这适用于涉及 new 的简单操作,但是当用户为命名空间定义本地运算符 new 时,此 appraoch 会导致问题。首先,像这样的台词

void* operator new(size_t size);

还与宏匹配;此外,对全局 new 的显式调用,例如:

int* i = ::new int;

导致语法错误。

有没有办法在部分代码中重新定义或抑制__LINE____FILE__常量(以便它们显示对运算符 new 的调用的文件名和行号)?如果不是,如何改进宏以不匹配用户定义的"运算符 new"并且不会导致"::new"问题?

我真的很想摆脱宏的不稳定。提前致谢:)

我知道没有办法非侵入性地做到这一点。过去,我使用正则表达式或 c++ 函数替换工具(如 Visual Studio 中提供的重构工具)来更改new的所有实例,以显式调用记录文件和行号的宏。

另一种选择是检测内存系统以记录堆栈帧。此方法具有较高的运行时成本,但如果由于滥用频繁利用的库代码而导致的分配发生泄漏,则此方法偶尔会很有用。没有与平台无关的方法可以做到这一点,有关适用于常见平台(Linux 和 Windows)的信息,请参阅此问题。

编辑:对于您的特定情况,您可以取消定义宏,并在引起麻烦的new标识符实例之后重新定义它。

好的,我已经放弃了尝试使宏工作。从外观上看,它不能。我已经编写了一个perl脚本来完成这项工作。它在预处理(预处理器)之前运行,并且比 C 预处理器执行的替换更智能。这些是用于将 new 和 ::new 匹配到其他内容的正则表达式:

$this =~ s/(::)?s*new([^w_])/__fl_init(__FILE__,__LINE__)?NULL: $1new$2/g;

我不知道,也许我会写一个批处理文件来自动预处理源代码。如果有人知道使用 CPP 的解决方法,请发表评论。