new (Operador) (C++)

Asigna memoria para un objeto o una matriz de objetos de type-name del almacén disponible y devuelve un puntero con un tipo adecuado distinto de cero al objeto.

Nota

Las extensiones de componentes de Microsoft C++ proporcionan compatibilidad para que la palabra clave new agregue entradas de ranura de vtable.Para obtener más información, vea nuevo (nueva ranura en vtable)

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

Comentarios

Si esta operación no se realiza correctamente, new 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 _set_new_handler con el nombre de función como su argumento.

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

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

Utilice el operador delete para desasignar la memoria asignada con el operador new.

En el ejemplo siguiente se asigna y se libera una matriz bidimensional de caracteres de tamaño dim por 10. Al asignar una matriz multidimensional, todas las dimensiones excepto la primera deben ser expresiones constantes que se evalúen como valores positivos; la dimensión de la matriz del extremo izquierdo puede ser cualquier expresión que se evalúe como un valor positivo. Al asignar una matriz mediante el operador new, la primera dimensión puede ser cero; el operador new devuelve un puntero único.

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

El elemento type-name no puede contener const, volatile, declaraciones de clase ni declaraciones de enumeración. Por consiguiente, la siguiente expresión no es válida:

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

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

El operador new no se puede utilizar para asignar una función, pero sí para asignar punteros a funciones. En el ejemplo siguiente se asigna y se libera una matriz de siete punteros a funciones que devuelven enteros.

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

Si usa el operador new sin ningún argumento adicional y compila con la opción /GX, /EHa o /EHs, el compilador generará código para llamar al operador delete si el constructor produce una excepción.

En la lista siguiente se describen los elementos de la gramática de new:

  • placement
    Proporciona una manera de pasar argumentos adicionales si se sobrecarga new.

  • type-name
    Especifica el tipo que se va a asignar; puede ser un tipo integrado o un tipo definido por el usuario. Si la especificación de tipo es compleja, puede ir entre paréntesis para forzar el orden de enlace.

  • initializer
    Proporciona un valor para el objeto inicializado. No se pueden especificar inicializadores para matrices. El operador new creará las matrices de objetos únicamente si la clase tiene un constructor predeterminado.

Ejemplo

En el ejemplo de código siguiente se asigna una matriz de caracteres y un objeto de clase CName y después se liberan.

// 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 formato de ubicación del operador new, el formato con argumentos además del tamaño de asignación, el compilador no admite un formato de ubicación del operador delete 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;
}

Vea también

Referencia

Expresiones con operadores unarios

Palabras clave de C++

Duración de objetos asignados con new

Inicializar objetos asignados con new

Cómo funciona new

operador new (Función)