new es un operador de lenguaje de programación C++ que proporciona una asignación de memoria dinámica en el montón . Con la excepción de un formulario llamado " formulario de asignación nuevo ", newintenta asignar suficiente memoria en el montón para acomodar los nuevos datos y, si tiene éxito, devuelve la dirección de la ubicación de memoria asignada. Sin embargo, si newno puede asignar memoria en el montón, generará una excepción de tipo std::bad_alloc. Esto elimina la necesidad de verificar explícitamente el resultado de la selección. Después de que el compilador encuentra la palabra clave, newgenera una llamada al constructor de clases [1] .
La sintaxis newse ve así:
p_var = nuevo nombre de tipo ;donde está el puntero de tipo p_var declarado anteriormente . puede significar cualquier tipo de datos fundamental u objeto definido por el usuario (incluidos , y ) . Si es un tipo de clase o estructura, debe tener un constructor predeterminado disponible que se llamará para crear el objeto. typenametypenameenumclassstructtypename
Para inicializar una nueva variable creada con new, use la siguiente sintaxis:
p_var = nuevo tipo ( inicializador );donde initializer es el valor inicial asignado a la nueva variable, y si type es el tipo de la clase, entonces initializer son los argumentos del constructor.
newtambién puede crear una matriz :
p_var = newtype [ tamaño ] ;En este caso, sizeespecifica la dimensión (longitud) de la matriz unidimensional creada. La dirección del primer elemento se devuelve y se coloca en p_var, por lo que
p_var [ n ]significa el valor del n-ésimo elemento (contando desde la posición cero)
La memoria asignada con newdebe liberarse con para deleteevitar una fuga de memoria . Los arreglos asignados (creados) con new[], deben ser liberados (destruidos) con delete[].
int * p_scalar = nuevo int ( 5 ); int * p_array = nuevo int [ 5 ];No se pueden especificar inicializadores para matrices creadas con new. Todos los elementos de la matriz se inicializan utilizando el constructor predeterminado para el tipo dado. Si el tipo no tiene un constructor predeterminado, el área de memoria asignada no se inicializará.
Hay una forma especial del operador new llamada Placement new. Este operador no asigna memoria, sino que toma como argumento una dirección a la memoria ya asignada de alguna forma (por ejemplo, en la pila o mediante malloc ()). El objeto se asigna (inicializa) llamando al constructor y el objeto se crea en la memoria en la dirección especificada. A menudo, este método se usa cuando la clase no tiene un constructor predeterminado y necesita crear una matriz de objetos. Una llamada de ejemplo se ve así:
#include <nuevo> // Requerido para usar la ubicación nueva clase A { público : A ( int x ){} ~ Un (){} }; const int n = 50 ; A * locationMemory = static_cast < A *> ( operator new [] ( n * sizeof ( A ))); para ( int i = 0 ; i < n ; i ++ ) { nuevo ( colocaciónMemoria + i ) A ( rand ()); //aquí no se asigna la memoria para el objeto, sino que se inicializa } //!!desinicialización de memoria para ( int i = 0 ; i < n ; i ++ ) { memoria de ubicación [ i ]. ~ A (); } operador eliminar [] ( placementMemory );Dado que el tipo de objeto(s) que se está creando no se especificó cuando se asignó la memoria, el compilador no llamará al destructor para cada objeto de la matriz, por lo que debe hacerse manualmente antes de liberar el bloque de memoria.
En los compiladores que se adhieren al estándar ISO C++ , si no hay suficiente memoria para asignar, se produce una excepción de tipo std::bad_alloc. La ejecución de todo el código subsiguiente se detiene hasta que el error se maneja en un bloque try-catch o el programa finaliza de manera anormal. El programa no necesita verificar el valor del puntero; si no se lanzó ninguna excepción, entonces la asignación fue exitosa. Las operaciones implementadas se definen en el encabezado <new>. En la mayoría de las implementaciones de C++, el operador newtambién se puede sobrecargar para definir un comportamiento especial.
Cualquier memoria dinámica asignada con new, debe liberarse con delete. Hay dos opciones: una para arreglos, la otra para objetos individuales.
int * p_var = nuevo int ; int * p_array = new int [ 50 ]; eliminar p_var ; eliminar [] p_array ;El estándar no requiere que el compilador genere un mensaje de diagnóstico cuando se usa incorrectamente delete; generalmente no puede saber cuándo un puntero apunta a un solo elemento y cuándo apunta a una matriz de elementos. Además, usar una liberación inapropiada es un comportamiento indefinido .
A diferencia de una función reallocen C , un operador new[]no puede reasignar directamente la memoria ya asignada. Para aumentar o disminuir el tamaño de un bloque de memoria, debe asignar un nuevo bloque del tamaño deseado, copiar los datos de la memoria anterior y eliminar el bloque anterior. La biblioteca estándar de C++ proporciona soporte para una matriz dinámica que se puede incrementar o disminuir en su clase de plantilla std::vector.