我有一个庞大的应用程序(数百万个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
现在,我的应用程序非常庞大,所以对我来说,理想情况下,我会把它放在一个头文件中,特别是包含在成千上万的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"
但这是一个难以解决的问题,因为我必须再修改数千个文件,并确保其
所以我的问题是:
由于
答案 0 :(得分:3)
您可以使用可变参数宏捕获新位置:
#define NEW_DEBUG(...) NEW_DEBUG2(_NORMAL_BLOCK, __FILE__, __LINE__, __VA_ARGS__ )
#define new NEW_DEBUG
但预处理器似乎不允许同时定义宏 参数和没有,并且首先应用没有参数的宏, 所以我没有找到一种方法来使用单个预处理器传递。 但是如果我们用上面的宏和/ E运行第一遍,似乎有可能有两个,
然后第二次传递
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define NEW_DEBUG2(...) new(__VA_ARGS__ )