是否有可能创建宏来替换operator new包含额外args的所有形式的重载...说__FILE__和__LINE__?
麻烦似乎operator new可以用括号括或不用括号编码,因此:
类似对象的宏:
#define new new(__FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
将取代声明,如:
A* a = new A();
Run Code Online (Sandbox Code Playgroud)和类似函数的宏:
#define new(A) new (A, __FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)
将取代声明,如:
A* a = new(std::nothrow) A();
Run Code Online (Sandbox Code Playgroud)不幸的是,尝试使用相同的标识符声明两个宏是错误的,即使它们的类型不同,因此以下操作失败:
#define new new(__FILE__, __LINE__)
#define new(A) new (A, __FILE__, __LINE__) // Error: "new" already defined
Run Code Online (Sandbox Code Playgroud)
由于我正在使用g ++,我希望使用它们的可变参数宏的语法会产生成功,但遗憾的是没有.下列:
#define new(...) new(__FILE__, __LINE__, ## __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
只匹配new(xyx) A(),而不是new A().
我有一个庞大的应用程序(数百万LOC,和数万个文件),我正在尝试使用debug crt来检测内存泄漏.我正试图像这样宏观化:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifndef NEW_DEBUG
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new NEW_DEBUG
#endif
Run Code Online (Sandbox Code Playgroud)
现在,我的应用程序是如此之大,所以对我而言,理想情况下,我会把它放在一个头文件中,特别是包含在成千上万的CPP文件中.不是一个有趣的任务.所以我试图将它放在SDK中的公共头文件中,该文件将包含在每个转换单元中.
我遇到的问题是它似乎与一些STL头文件冲突,并且编译器在使用placement new时发出错误.我可以通过使用pragma和禁用新宏在我自己的代码中更改它.那不是问题.这是使用贴牌新的STL头文件,我无法改变.
通过重新排列cpp文件中的include指令,我找到了解决方法.例如:
// doesn't compile
#include "new_redirect.h"
#include <map> // for instance
// does compile
#include <map> // for instance
#include "new_redirect.h"
Run Code Online (Sandbox Code Playgroud)
但这是一个困难的解决办法,因为我必须再修改数千个文件,并确保他们的STL标题包含在其他任何内容之前.具有讽刺意味的是,我创建了一个hello world应用程序来专门测试这个问题:我的hello-world应用程序编译得很好.但是如果没有这种解决办法,我的庞大应用程序就不会.
所以我的问题是:
谢谢
我看到了跟随宏,
#ifdef _DEBUG
#define new DEBUG_NEW
#UNDEF THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Run Code Online (Sandbox Code Playgroud)
上面宏的用法是什么?
谢谢