Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés
Se recomienda usar Visual Studio 2017
Esta documentación está archivada y no tiene mantenimiento.

operador new (C++)

Asigna memoria para un objeto o una matriz de objetos del nombre de tipo de almacén libre y devuelve un puntero un tipo, distinto al objeto.

[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]

Si no, nuevo devuelve cero o produce una excepción; vea Los operadores new y delete para obtener más información. Puede cambiar este comportamiento predeterminado escribiendo una rutina de control de excepciones personalizada y llamando a la función de biblioteca en tiempo de ejecución de _set_new_handler con el nombre de función como argumento.

Para obtener información sobre cómo crear un objeto en el montón administrado, vea gcnew.

Cuando nuevo se utiliza para asignar memoria para el objeto de clase de C++., se llama al constructor del objeto después de que se asigna memoria.

Utilice el operador de cancelación para desasignar la memoria asignada con el operador de nuevo .

El ejemplo siguiente asigna y libera una matriz bidimensional de caracteres de tamaño dim por 10. Al asignar una matriz multidimensional, todas las dimensiones excepto las primeras deben ser las expresiones constantes que se evalúan como valores positivos; la dimensión de izquierda de la matriz puede ser cualquier expresión que se evalúa como un valor positivo. Al asignar una matriz mediante el operador de nuevo , la primera dimensión puede ser cero — el operador de nuevo devuelve un puntero único.

char (*pchar)[10] = new char[dim][10];
delete [] pchar;

El nombre de tipo no puede contener const, volatile, declaraciones de clase, o declaraciones de enumeración. Por consiguiente, la siguiente expresión no es válida:

volatile char *vch = new volatile char[20];

El operador de nuevo no asigna tipos de referencia porque no son objetos.

El operador de nuevo no se puede utilizar para asignar una función, pero puede ser utilizada para asignar punteros a funciones. El ejemplo siguiente asigna y libera una matriz de siete punteros a funciones de enteros return.

int (**p) () = new (int (*[7]) ());
delete *p;

Si se utiliza el operador nuevo sin argumentos adicionales, y compilar con /GX, /EHa, o la opción de /EHs , el compilador generará código para llamar al operador cancelación si el constructor produce una excepción.

La lista siguiente se describen los elementos de la gramática de nuevo:

posición

Proporciona una manera de pasar argumentos adicionales si se sobrecarga nuevo.

nombre de tipo

Especifica el tipo que se asignará; puede ser una cuenta integrada o tipo definido por el usuario. Si la especificación de tipo es complicado, puede ser entre paréntesis para forzar el orden de enlace.

inicializador

proporciona un valor para el objeto inicializado. los inicializadores no se pueden especificar para las matrices. El operador de nuevo creará las matrices de objetos sólo si la clase tiene un constructor predeterminado.

El ejemplo de código siguiente asigna una matriz de caracteres y un objeto de clase CName y después free.

// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>

class CName {
public:
   enum {
      sizeOfBuffer = 256
   };

   char m_szFirst[sizeOfBuffer];
   char m_szLast[sizeOfBuffer];

public:
   void SetName(char* pszFirst, char* pszLast) {
     strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
     strcpy_s(m_szLast, sizeOfBuffer, pszLast);
   }

};

int main() {
   // Allocate memory for the array
   char* pCharArray = new char[CName::sizeOfBuffer];
   strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");

   // Deallocate memory for the array
   delete [] pCharArray;           
   pCharArray = NULL;

   // Allocate memory for the object
   CName* pName = new CName;
   pName->SetName("Firstname", "Lastname");

   // Deallocate memory for the object
   delete pName;
   pName = NULL;
}

Si utiliza el nuevo formulario de colocación del operador de nuevo , el formulario con argumentos además del tamaño de asignación, el compilador no admite un formulario de colocación del operador de cancelación si el constructor produce una excepción. Por ejemplo:

// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
   A(int) { throw "Fail!"; }
};
void F(void) {
   try {
      // heap memory pointed to by pa1 will be deallocated
      // by calling ::operator delete(void*).
      A* pa1 = new A(10);
   } catch (...) {
   }
   try {
      // This will call ::operator new(size_t, char*, int).
      // When A::A(int) does a throw, we should call
      // ::operator delete(void*, char*, int) to deallocate
      // the memory pointed to by pa2.  Since
      // ::operator delete(void*, char*, int) has not been implemented,
      // memory will be leaked when the deallocation cannot occur.

      A* pa2 = new(__FILE__, __LINE__) A(20);
   } catch (...) {
   }
}

int main() {
   A a;
}
Mostrar: