c++ - allocate - ¿Cómo llamo al "operador nuevo" original si lo sobrecargué?
c++ allocate memory (1)
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 intento implica una llamada a la función de biblioteca Standard C malloc no está especificado.
- Devuelve un puntero al almacenamiento asignado si el intento 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 intento de asignar el almacenamiento solicitado se realiza correctamente o cuando una función llamada new_handler no regresa.
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()
?