【发布时间】:2013-12-19 03:29:20
【问题描述】:
我正在为 c++ 制作内存泄漏检测器。它替换了全局new操作符,使用宏初始化两个全局变量__file__和__line__,如下所示:
#define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new
我从另一个我不记得名字的 StackOverflow 用户那里学到了这个技巧。这适用于涉及 new 的简单操作,但是当用户为命名空间定义本地 operator new 时,这种方法会导致问题。一方面,像
这样的行void* operator new(size_t size);
也被宏匹配;此外,显式调用 global new,例如:
int* i = ::new int;
导致语法错误。
有没有办法在部分代码中重新定义或抑制 __LINE__and__FILE__ 常量(以便它们显示对 operator new 的调用的文件名和行号)?如果不是,如何改进宏以不匹配用户定义的“operator new”并且不会导致“::new”出现问题?
我真的很想摆脱宏的怪癖。在此先感谢:)
【问题讨论】:
-
这就是 C++ 语言定义不允许创建重新定义关键字的宏的原因。
-
通过重新定义关键字将新值分配给两个全局变量(更糟糕的是,使用保留名称)不会生成泄漏检测器(除非您假设它始终是最后一次泄露的分配)。虽然您已经在使用非标准的东西,但我宁愿建议您使用自定义分配器重载全局
operator new和delete,该分配器会为每个分配记住__builtin_return_address(1)。 -
@Damon 宏不是程序的唯一部分,我确实替换了全局 new 和 delete 运算符。信息存储在一个链表中。