Cómo reemplazar apropiadamente operadores globales nuevos y eliminar

En primer lugar, hubo al menos 4-5 temas con un tema similar en SO. Leo cada uno de ellos y no creo que realmente me ayuden con este tema específico. Si alguien más encuentra una pregunta duplicada, me disculpo. He hecho mi parte de búsqueda antes de publicar esto, ya que parece ser una pregunta muy común.

Estoy usando Visual Studio .NET 2003 en Windows 7.

Tengo mis propias sobrecargas de new / delete que apuntan a mis propias llamadas personalizadas a malloc () y free () para diagnósticos. Mis nuevas / borrar sobrecargas están en un archivo de encabezado que he incluido en algunos archivos.

El problema es que la base de código es prácticamente espagueti y no hay una manera fácil de asegurarse de que todas estas sobrecargas se usen para todo. Hay incluye bibliotecas de terceros que son black-box. También usamos STL en todas partes.

En mis pruebas, he descubierto que STL todavía está mezclando llamadas a mi propio / nuevo y las llamadas nuevas / eliminadas de MSVC estándar.

No parece realista incluir mi archivo de encabezado en miles de otros archivos, eso tomaría demasiado tiempo. ¿Alguien puede ofrecer algunos consejos sobre cómo sobrecargar correcta y eficazmente nuevo / eliminar globalmente para que todo use mi administrador de memoria personalizado?

Así no es como funciona esto. Reemplace los dos operadores, y esto se hace en tiempo de enlace . Todo lo que necesita hacer es escribir una sola TU que defina estos operadores y vincularla a la mezcla. Nadie más necesita saber sobre esto:

// optional_ops.cpp void * operator new(std::size_t n) throw(std::bad_alloc) { //... } void operator delete(void * p) throw() { //... } 

En principio, no hay necesidad de ningún archivo de cabecera para declarar estas funciones ( operator new , operator delete ), ya que las declaraciones de esas dos funciones ya están codificadas en el idioma, si se quiere. Sin embargo, los nombres std , std::bad_alloc y std::size_t no están predefinidos, por lo que es probable que desee incluir o algún otro encabezado para proporcionar esos nombres.

En C ++ 11 y posteriores, puede usar alternativamente decltype(sizeof(0)) para obtener el tamaño del primer parámetro de una manera que no requiera ningún tipo de biblioteca. C ++ 11 también tiene un modelo de excepción más simple sin especificaciones de excepción dinámica (que finalmente fueron eliminadas del lenguaje por completo en C ++ 17).

 void * operator new(decltype(sizeof(0)) n) noexcept(false) { //... } 

También agregue estas líneas:

 void *operator new[](std::size_t s) throw(std::bad_alloc) { // TODO: implement return NULL; } void operator delete[](void *p) throw() { // TODO: implement }