使用调试版覆盖新版,而不会损坏新版本

Jan*_*dec 6 c++ visual-c++ c++03

Microsoft运行时库提供分配函数的调试版本.对于C++,这是具有签名的operator new的调试变体:

void *operator new(size_t size, int blockType, const char *filename, int linenumber);
Run Code Online (Sandbox Code Playgroud)

并且宏被定义为

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)

现在要对所有分配进行检测,通常可以定义

#if defined DEBUG_NEW
#define new DEBUG_NEW
#endif
Run Code Online (Sandbox Code Playgroud)

但是,这个定义会破坏使用placement new的任何地方,因为这两组参数最终都是语法错误.现在,我可以轻松处理代码中的少数用法,但标准库和boost使用新的位置.因此,定义全局意味着在定义之前包含许多内容并且会减慢编译速度.

那么有没有办法在我们的代码中设置分配而不是仅仅因为它们包含新的放置而不必将上一个定义放在所有文件中或者手动编写DEBUG_NEW?

小智 6

#pragma push_macro("new")
#undef new

new(pointer) my_class_t(arg1, arg2);

#pragma pop_macro("new")
Run Code Online (Sandbox Code Playgroud)

要么

#pragma push_macro("new")
#undef new

#include <...>
#include <...>
#include <...>

#pragma pop_macro("new")
Run Code Online (Sandbox Code Playgroud)


Jan*_*dec 0

这整个 DEBUG_NEW 东西应该死在火里!它几乎没有什么用处,而且在现代 C++ 中根本没有用,因为你不再new在理智的 C++ 中看到它。

有更好的选择,如 DUMA,现在有了Dr. Memory (其工作方式与Valgrind类似,但在 Windows 上),使用 DEBUG_NEW 令人厌恶的东西绝对没有意义。