Supongamos que necesito sobrecargar global ::operator new()
para almacenar datos adicionales con cada objeto asignado . Entonces, básicamente, funcionaría de esta manera:
::operator new()
se tomará el tamaño del objeto pasado y se agregará el tamaño de datos adicionales ::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.