重新定义__LINE__和__FILE__常量
redefine __LINE__ and __FILE__ constants
我正在为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 的解决方法,请发表评论。
- Seg Fault Issue C++ (file IO / getline)
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- Visual Studio C++ Project File CustomBuild Task: Filter Outp
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 以某种方式告诉编译器"Do not process line of code"
- 可视化 如何在C++中将字符数组转换为 FILE 类型
- 如何在从文件中读取整数时使用 file.eof()?
- "No such file or directory" C++标头问题
- 使用 sftp_open() 使用 C++ 中的 SFTP libssh 将文件从本地复制到远程时,File 返回 N
- Visual Studio "fatal error LNK1104: cannot open file"未使用或包含的库
- typedef vector size_type in header file
- make 命令创建 .file,但不创建应用程序文件
- 为什么 VScode 在 .h 文件中显示"'iostream' file not found"?
- 我在 #include < bits/stdc++h.> 放置时出错"No such file or directory"
- 使用 编译时。RES File with MinGW G++, .无法识别 RES
- qSetMessagePattern( "%{file}(%{line}): %{message}" ) 输出"unkown(0)"
- GDB 不断产生"No line xx in file"错误,即使文件包含以下行
- "Peek ahead"检查下一次对getline(file,line)的调用是否会返回false - 而不实际调用它,即不消耗该行