Programación General > C/C++
override del operador new
(1/1)
diego.martinez:
Buenas:
estoy probando a hacer override del operador new para hacerme checkeos de memoria y ver si alguna funcion tiene "leaks".
para ello me he hecho:
--- Código: C++ --- #ifdef _MY_MEMORY_CONTROL_OVERRIDE void* operator new(size_t size){ void *p=malloc(size); if (p!=NULL) if (IsDebuggerPresent()) { char s[100]; sprintf(s,"Mem: %08x Size: %07d Total:%dn",p,size,MemControl::APP_GlobalMemoryAllocated); OutputDebugStringA(s); MemControl::APP_GlobalMemoryAllocated+=(unsigned long)size; MemControl::Add(size,p); } return p;} #endif
asi cada vez que se localiza memoria me lo muestra en el output del debugger.
para que me muestre la linea y fichero, le añado:
--- Código: C++ --- void* operator new(size_t size,char *szFile = __FILE__, UINT nLineNo = __LINE__)
al hacerlo me muestra los errores :
error C2668: 'operator new' : ambiguous call to overloaded function
por lo visto no sabe diferenciar entre el new de siempre y mi nuevo new, entonces, como puedo forzarle a usar el mio?
Eternal Idol:
El operador new no puede tener esos parametros.
diego.martinez:
buenas, pues al final lo resolví con lo que yo entiendo que es un parche, pero como solo es una herramienta de debug, me viene bien para la verificación y luego se quita para la release.
os pongo como lo he hecho:
--- Código: C++ --- #ifdef _DEBUG #include <new> void* operator new (size_t size, const char* file, int line, const char *); void* operator new[] (size_t size, const char* file, int line, const char *); void* operator new (size_t size); #define DEBUG_NEW new(__FILE__, __LINE__,__FUNCTION__) void operator delete (void * size); void operator delete (void * size, const char* file, int line, const char *); void operator delete[] (void * size, const char* file, int line, const char *); #else #define DEBUG_NEW new #endif
me defino operadores new con varios argumentos, sin embargo no predefino los argumentos, sino que preparo la macro DEBUG_NEW para llamar a new con los argumentos indicados.
luego , para no tener que cambiar el codigo en el programa:
--- Código: C++ --- #include <gMemory.h>#define new DEBUG_NEW
Con lo que mis new se convierten en DEBUG_NEW que es lo mismo que new(__FILE__,__LINE__,__FUNCTION__) con lo que cuando se llama a new, se llama a mi operador new sobrecargado. asi, cada vez que se localiza memoria, lo almaceno en un vector, y cuando se llama a delete, uso el puntero para buscarlo en mi lista y eleminarlo, con lo que al terminar la ejecución , los registros del vector me indican que localización de memoria no se liberó. :good:
Los operadores delete de mas que defino son necesarios para que el compilador no produzca un error al no encontrar el delete correspondiente, aunque no hace falta, ya que con hacer delete del puntero, ya sabremos que registro del vector es el que se elimina.
Es un poco chapuza, pero da el pego. A mi objeto global MEMORY, le he puesto una variable para evitar la reentrancia al localizar nuevos registros y que no me marque estos como localizaciones de memoria. Me falta añadirle sincronización para multitarea.
que os parece?
Navegación
Ir a la versión completa