使用placement new替换new与宏冲突

时间:2011-02-14 10:07:36

标签: c++ windows memory-leaks crtdbg.h

我有一个庞大的应用程序(数百万个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"

但这是一个难以解决的问题,因为我必须再修改数千个文件,并确保其标题包含之前其他任何文件。具有讽刺意味的是,我创建了一个hello world应用程序来专门测试这个问题:我的hello-world应用程序编译得很好。但是,如果没有这种解决办法,我的庞大应用程序就没有。

所以我的问题是:

  1. 有没有人能够完全宏观化,而不会摇晃大量的代码? (以相对无痛的方式)
  2. 任何其他方法来重新安排我的STL标头包括指令?
  3. 由于

1 个答案:

答案 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__ )