замена нового на макрос конфликтует с размещением нового

У меня огромное приложение (несколько миллионов LOC и десятки тысяч файлов), и я пытаюсь использовать 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, и компилятор выдает ошибки при использовании размещения new. Я могу изменить это в своем собственном коде, используя директивы pragma и отключив новый макрос. Это не проблема. Это заголовочные файлы STL, которые используют новое размещение, я не могу изменить.

Я нашел обходной путь , переставив директивы include в файлах cpp. Например:

// doesn't compile
#include "new_redirect.h"
#include <map> // for instance

// does compile
#include <map> // for instance
#include "new_redirect.h"

Но это трудный обходной путь, потому что я снова должен изменить тысячи файлов и убедиться, что их заголовки STL включены перед чем-либо еще. Ирония заключается в том, что я создал приложение hello world специально для проверки этой проблемы: и мое приложение hello-world скомпилировалось нормально. Но мое массивное приложение не обходится без этого обходного пути.

Итак, у меня следующие вопросы:

  1. Кто-нибудь смог полностью создать макрос для нового, не теребя огромное количество кода? (Относительно безболезненно)
  2. Любой другой способ обойти перестановку моих директив include в заголовке STL?

Спасибо

7
задан C Johnson 14 February 2011 в 10:07
поделиться