c++ operator-overloading new-operator delete-operator

c++ - sobrecargar nuevo/borrar



operator-overloading new-operator (6)

Estoy haciendo un pequeño buscador de fugas de memoria en mi programa, pero mi forma de sobrecargar nuevas y eliminar (y también nuevas [] y eliminar []) no parece hacer nada.

void* operator new (unsigned int size, const char* filename, int line) { void* ptr = new void[size]; memleakfinder.AddTrack(ptr,size,filename,line); return ptr; }

La forma en que sobrecargué new se muestra en el fragmento de código anterior. Supongo que es algo con el operador que devuelve vacío * pero no sé qué hacer al respecto.


¿Está invocando al operador sobrecargado correctamente, es decir, pasándole los parámetros adicionales?


Creo que el problema aquí es que el perfil de parámetros de su nuevo no coincide con el del operador estándar nuevo, por lo que uno no se oculta (y, por lo tanto, sigue utilizándose).

Tus perfiles de parámetros para nuevo y eliminar deben verse así:

void* operator new(size_t); void operator delete(void*, size_t);


El problema se basa en los dos argumentos que ha agregado al nuevo operador sobrecargado. Intente hacer que el nombre de archivo y la línea sean globales de alguna manera (o las variables miembro si está sobrecargando nuevas y eliminadas para una sola clase). Eso debería funcionar mejor.


RE:

Nunca intente sobrecargar nuevo / eliminar globalmente

¿Por qué cada vez que alguien intenta usar una característica menos común de C ++, alguien actúa como si nunca se hiciera?

Se hace todo el tiempo, es bastante común, y no he trabajado para una empresa que no hizo esto.

Las nuevas y eliminaciones con sobrecarga global son extremadamente útiles para rastrear memoria, errores de memoria, sobrecargas de búfer, etc.

Nadie en su sano juicio pasará por un programa con varios millones de líneas de código y agregará un nuevo miembro y eliminará a todas y cada una de las clases. Eso es simplemente estúpido.


Tal vez puedas hacer lo que quieras con un poco de magia de preprocesador:

#include <iostream> using namespace std; void* operator new (size_t size, const char* filename, int line) { void* ptr = new char[size]; cout << "size = " << size << " filename = " << filename << " line = " << line << endl; return ptr; } #define new new(__FILE__, __LINE__) int main() { int* x = new int; }


void* ptr = new void[size];

No puedo hacer eso Arreglalo.

Nunca intente sobrecargar nuevo / eliminar globalmente. Téngalos en una clase base y derive todos sus objetos de esta clase o use un espacio de nombres o un parámetro de asignación de plantilla. Por qué, puedes preguntar. Porque en caso de que su programa sea más que un solo archivo y el uso de STL u otras bibliotecas, lo arruinará.

Aquí hay una versión destilada del new operador de VS2005 new.cpp :

void * operator new(size_t size) _THROW1(_STD bad_alloc) { // try to allocate size bytes void *p; while ((p = malloc(size)) == 0) if (_callnewh(size) == 0) { // report no memory static const std::bad_alloc nomem; _RAISE(nomem); } return (p); }