c++ - php_eol - redefinir las constantes__LINE__ y__FILE__
require dirname(__ file__) (2)
Ok, he dejado de intentar hacer que la macro funcione. Por el aspecto de esto, no puede. He escrito una secuencia de comandos de Perl para hacer el trabajo. Se ejecuta antes del preprocesamiento (un preprocesador) y realiza una sustitución más inteligente que la que haría el preprocesador C. Estas son las expresiones regulares que se usan para hacer coincidir lo nuevo y lo nuevo en algo más:
$this =~ s/(::)?/s*new([^/w_])/__fl_init(__FILE__,__LINE__)?NULL: $1new$2/g;
No sé, tal vez escribiré un archivo por lotes para auto preprocesar la fuente. Comente si alguien conoce una solución alternativa utilizando el CPP.
Estoy haciendo un detector de fuga de memoria para c ++. Reemplaza al nuevo operador global y usa una macro para inicializar dos variables globales, __file__
y __line__
, como __line__
:
#define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new
Aprendí este truco de otro usuario de StackOverflow cuyo nombre no recuerdo. Esto funciona bien con operaciones simples que implican nuevo, sin embargo, este enfoque causa problemas cuando el usuario define un operador local nuevo para un espacio de nombres. Por un lado, líneas como
void* operator new(size_t size);
también es igualado por la macro; también, llamadas explícitas a global nuevo, como:
int* i = ::new int;
causa errores sintácticos.
¿Hay alguna manera de redefinir o suprimir las constantes __LINE__
y __FILE__
(para que muestren el nombre del archivo y el número de línea de la llamada al operador nuevo) en parte del código? De lo contrario, ¿cómo podría mejorarse la macro para que no coincida con el "operador nuevo" definido por el usuario y no causar problemas con ":: nuevo"?
Realmente me encantaría deshacerme de lo maravilloso de las macros. Gracias por adelantado :)
No conozco ninguna forma de hacer esto de manera no intrusiva. En el pasado, he usado una herramienta de reemplazo de funciones regex o c ++ (como las herramientas de refactorización disponibles en Visual Studio) para cambiar todas las instancias de las new
y llamar explícitamente a una macro que registra el archivo y el número de línea.
Otra opción es instrumentar su sistema de memoria para grabar cuadros de pila. Este método viene con un mayor costo de tiempo de ejecución, pero de vez en cuando será útil si la fuga se produce a partir de una asignación que se produce debido al uso indebido de código de la biblioteca con frecuencia apalancada. No existe una manera de hacer esto para la plataforma, consulte esta pregunta para obtener información que se aplica a las plataformas comunes (Linux y Windows).
Editar: para su caso específico, podría definir la macro y redefinirla después de las instancias del new
identificador que está causando problemas.