2010-11-09 11 views
27

Supongamos que necesito sobrecargar global ::operator new()for storing extra data with each allocated object. Así que básicamente sería trabajar de esta manera:¿Cómo llamo al "operador nuevo" original si lo sobrecargué?

  • para cada llamada al mundial ::operator new() que tomará el tamaño del objeto pasado y añadir el tamaño de los datos adicionales
  • se asignar un bloque de memoria de tamaño deduce al anterior
  • paso
  • se procederá a compensar el puntero a la parte del bloque no está ocupado con los datos adicionales y de retorno que compensan el valor de la persona que llama

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

Ahora la pregunta es ¿cómo asigno la memoria? Por supuesto, puedo llamar al 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++, llamo al ::operator new(). ¿Puedo llamar al ::operator new() original para hacer la asignación de memoria desde mi sobrecargado global ::operator new()?

+8

¿Quieres decir sobrecargado o reemplazado? Si está sobrecargado, simplemente llame al operador original nuevo usando el conjunto correcto de argumentos. Si se reemplaza, entonces no puedes, pero creo que esto es _por qué_ 'malloc' está garantizado para no usar' operator new' en su implementación (es decir, no hay bucles involuntarios cuando se reemplaza el operador new) por lo que probablemente deberías estar usando 'malloc' . –

+2

@CharlesBailey ¡Escribió su respuesta como comentario! ¡para vergüenza! –

Respuesta

18

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

Esencialmente, debe llamar al malloc desde un ::operator new personalizado. No sólo eso, sino que también siguen las direcciones en las 18.4.1.1/4 para manejar adecuadamente los errores: Comportamiento

defecto:

- Ejecuta un bucle: Dentro del bucle, la función primeros intentos de asignar el almacenamiento solicitado . Si el intento implica una llamada a la biblioteca estándar C malloc función no se especifica.

- Devuelve un puntero al almacenamiento asignado si el intento se realiza correctamente. De lo contrario, si el último argumento para set_new_handler() era un puntero nulo, throw bad_alloc.

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

- El bucle termina cuando un intento de asignar el almacenamiento solicitada es exitosa o cuando una llamada función new_handler no vuelve.

+1

Y no se olvide de reemplazar 'operator delete' también, con' free() '. – wilhelmtell

+0

Creo que Scott Meyers habla de esto en detalle en sus libros _Effective C++ _. El ítem 8 en la segunda edición, y el capítulo 8 en la 3ra, como parece. – wilhelmtell

+0

@Potatoswatter: ¿No podría usar 'malloc()' para asignar la memoria para su clase y datos adicionales y luego llamar 'placement-new' para crear una instancia del objeto de clase dentro de esta memoria. Ya que solo está reemplazando la versión regular de 'new', ¿no se llamaría' placement-new' por defecto? – Praetorian

Cuestiones relacionadas