gpt4 book ai didi

c++ - 重新定义 __LINE__ 和 __FILE__ 常量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:51 25 4
gpt4 key购买 nike

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

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

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

void* operator new(size_t size);

也被宏匹配;此外,显式调用 global new,例如:

int* i = ::new int;

导致句法错误。

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

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

最佳答案

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

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

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

关于c++ - 重新定义 __LINE__ 和 __FILE__ 常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20672979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com