2011-02-14 18 views
6

Tengo una aplicación masiva (varios millones de archivos LOC y decenas de miles de archivos), y estoy tratando de utilizar el crt de depuración para detectar fugas de memoria. Estoy tratando de macro-Ize nueva de este modo:reemplazando nuevo con conflictos de macro con ubicación nueva

#define _CRTDBG_MAP_ALLOC 
#include <crtdbg.h> 
#ifndef NEW_DEBUG 
#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new NEW_DEBUG 
#endif 

Ahora, mi aplicación es tan grande, así que para mí, a ser posible, me gustaría poner esto en un archivo de cabecera e incluyen específicamente que en decenas de miles de Archivos CPP No es una tarea divertida. Así que he intentado colocar esto en un archivo de encabezado común en nuestro SDK, que se incluirá en cada unidad de traducción.

El problema que me encuentro es que parece chocar con algunos archivos de encabezado STL, y el compilador emite errores cuando se usa la ubicación nueva. Puedo cambiar eso en mi propio código, usando pragma y deshabilitando la nueva macro. No hay problema allí. Son los archivos de encabezado STL que usan la ubicación nueva, no puedo cambiar.

He descubierto un work-around, reorganizando las directivas include en los archivos cpp. Por ejemplo:

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

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

Pero esta es una difícil solución alternativa porque, de nuevo, tengo que ir a modificar miles de archivos, y asegurarse de que sus cabeceras de STL se incluyen antes cualquier otra cosa. Lo irónico es que he creado una aplicación hello world para probar específicamente este problema: Y la aplicación hola-mundo compilada muy bien. Pero mi aplicación masiva no lo hace, sin esta solución.

Así que mis preguntas son:

  1. Alguien ha sido capaz de macro-ize nuevo por completo sin moviéndose por cantidades masivas de código? (De una manera relativamente indolora)
  2. ¿Alguna otra forma de evitar la reorganización de mi encabezado STL incluye directivas?

Gracias

+0

visto esta pregunta http://stackoverflow.com/questions/4301505/compile- errors-when-i-using-crt-memory-leak-detection? – sharptooth

+0

No, no lo he hecho, pero después de leerlo, se siente como el clavo en el ataúd de mis esperanzas de usar esto ... –

+0

La redefinición de "nuevo" suele ser una mala idea (tm). También vea [aquí] (http://stackoverflow.com/questions/3202520/) y [aquí] (http://stackoverflow.com/questions/1326656/). –

Respuesta

3

Usted puede coger la colocación de nuevo con una macro variadic:


#define NEW_DEBUG(...) NEW_DEBUG2(_NORMAL_BLOCK, __FILE__, __LINE__, __VA_ARGS__) 
#define new NEW_DEBUG 

pero no parece que el preprocesador para permitir la definición de una macro ambos con argumentos y por fuera, y una macro sin argumentos se aplica primero, , así que no encontré la manera de hacerlo con un solo pase de preprocesador. Pero parece posible con dos, si corríamos primera pasada con macros anteriores y/E, a continuación, segundo pase con


#define NEW_DEBUG new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define NEW_DEBUG2(...) new(__VA_ARGS__) 
+0

Gracias por la excelente respuesta. Supongo que solo podemos esperar un compilador que haga dos pasos ... espere, quiero un lenguaje de programación que no use uno. Ah qué desastre. –

Cuestiones relacionadas