¿Cómo llamo al “operador nuevo” original si lo sobrecargué?

Supongamos que necesito sobrecargar global ::operator new() para almacenar datos adicionales con cada objeto asignado . Entonces, básicamente, funcionaría de esta manera:

  • para cada llamada a global ::operator new() se tomará el tamaño del objeto pasado y se agregará el tamaño de datos adicionales
  • asignará un bloque de memoria de tamaño deducido en el paso anterior
  • desplazará el puntero a la parte del bloque que no está ocupada con datos adicionales y devolverá ese valor de compensación a la persona que llama

::operator delete() hará lo mismo a la inversa: mueva el puntero, acceda a datos adicionales, desasigne la memoria.

Ahora la pregunta es ¿cómo puedo asignar memoria ? Por supuesto, puedo llamar a malloc() o a alguna función específica de la plataforma (así es como generalmente se hace). Pero normalmente cuando necesito asignar memoria cruda en C ++, invoco ::operator new() . ¿Puedo llamar al original ::operator new() para hacer la asignación de memoria desde dentro de mi sobrecargado global ::operator new() ?

No puede acceder a ellos porque en realidad no está sobrecargando, es un reemplazo. Cuando defines tu propio ::operator new , el anterior desaparece. Eso es más o menos eso.

Básicamente, debe llamar a malloc desde un ::operator new personalizado ::operator new . No solo eso, sino que también siga las instrucciones en 18.4.1.1/4 para manejar adecuadamente los errores:

Comportamiento por defecto:

– Ejecuta un bucle: dentro del bucle, la función primero intenta asignar el almacenamiento solicitado. Si el bash implica una llamada a la función de biblioteca Standard C malloc no está especificado.

– Devuelve un puntero al almacenamiento asignado si el bash es exitoso. De lo contrario, si el último argumento para set_new_handler () era un puntero nulo, ejecute bad_alloc.

– De lo contrario, la función llama al new_handler actual (18.4.2.2). Si la función llamada regresa, el ciclo se repite.

– El ciclo finaliza cuando un bash de asignar el almacenamiento solicitado se realiza correctamente o cuando una función llamada new_handler no regresa.