Compartir a través de


Cómo funciona new

La expresión de asignación allocation-expression –la expresión que contiene el operador new– hace tres cosas:

  • Busca y reserva el almacenamiento para el objeto o los objetos a asignar. Cuando se completa esta fase, se asigna la cantidad correcta de almacenamiento, pero no es todavía un objeto.

  • Inicializa los objetos. Una vez completada la inicialización, hay suficiente información presente para que el almacenamiento asignado sea un objeto.

  • Devuelve un puntero a los objetos de un tipo de puntero derivado de new-type-name o type-name. El programa usa este puntero para tener acceso al objeto recién asignado.

El operador new invoca la función operator new. Para las matrices de cualquier tipo y para objetos que no son de tipo class, struct o union, se llama a una función global, ::operator new, para asignar almacenamiento. Los objetos de tipo de clase pueden definir su propia función de miembro estática operator new clase por clase.

Cuando el compilador encuentra el operador new para asignar un objeto de tipo type, emite una llamada a type**::operator new( sizeof(** type ) ) o, si no se define ningún operator new definido por el usuario, ::operator new( sizeof( type ) ). Por consiguiente, el operador new puede asignar la cantidad de memoria correcta para el objeto.

NotaNota

El argumento para operator new es de tipo size_t.Este tipo se define en DIRECT.H, MALLOC.H, MEMORY.H, SEARCH.H, STDDEF.H, STDIO.H, STDLIB.H, STRING.H, y TIME.H.

Una opción de la gramática permite la especificación de placement (vea la gramática para new (Operador)). El parámetro placement solo se puede utilizar para las implementaciones definidas por el usuario de operator new; permite pasar información adicional a operator new. Una expresión con un campo placement tal como T *TObject = new ( 0x0040 ) T; se convierte en T *TObject = T::operator new( sizeof( T ), 0x0040 ); si la clase T tiene el operator new de miembro; si no, se convierte en T *TObject = ::operator new( sizeof( T ), 0x0040 );.

La intención original del campo placement es permitir que los objetos dependientes de hardware se asignen a direcciones especificadas por el usuario.

NotaNota

Aunque en el ejemplo anterior solo se muestra un argumento en el campo placement, no hay ninguna restricción sobre cuántos argumentos adicionales se pueden pasar a operator new de esta forma.

Aunque se haya definido operator new para un tipo de clase, el operador global se puede usar con la forma de este ejemplo:

T *TObject =::new TObject;

El operador de resolución de ámbito (::) fuerza el uso del operador global new.

Vea también

Referencia

new (Operador) (C++)