Operadores new y delete

De ChuWiki

Operadores new y delete globales[editar]

Además de los operadores new y delete de las clases, C++ nos permite sobrecargar el new y delete de las clases globales.

Basta con hacer el siguiente código

Operador new:

void *operator new(size_t tamano)
{
   return malloc(tamano);
}

Operador new[]:

void *operator new [] (size_t tamano)
{
   return malloc (tamano);
}

Operador delete:

void operator delete (void *p)
{
   free (p);
}

Operador delete[]:

void operator delete [](void *p)
{
   free(p);
}

Según el compilador que usemos, será necesario o no redifinir las cuatro opciones. Algunos compiladores dan error en los operadores con corchete. Basta con no redifinir esas funciones.

Si compilamos este código y lo añadimos como parte de nuestro programa, cada vez que se haga un new o un delete, se llamará a nuestro operador.

Esta sobrecarga tiene mucha utilidad para depuración, ya que nos permite llevar contabilidad de punteros creados y liberados, localizando así más fácilmente fallos en la reserva de memoria de punteros.

Una utilidad práctica, por ejemplo, consiste en poner un contador de punteros global inicializado a cero. Cada vez que se haga un new lo incrementamos. Cada vez que se haga un delete lo decrementamos. Sacando por pantalla (o mirando con debugger) el valor de este contador antes y después de llamar a una función o método, sabemos si esa función o método se deja memoria sin liberar.

Otra utilidad práctica. Si en una array o lista guardamos todos los punteros devueltos en cada new y los quitamos de la lista o el array cuando se hace delete, podremos saber si en algún sitio se hace delete de un puntero que previamente no ha sido reservado. Este error suele corromper el gestor de memoria haciendo que tengamos fallos en sitios inesperados.