Condividi tramite


Operatore new (C++)

Alloca la memoria per un oggetto o una matrice di oggetti di type-name dall'archiviazione disponibile e restituisce all'oggetto un puntatore opportunamente tipizzato, diverso da zero.

Nota

Le estensioni di componenti di Microsoft C++ forniscono supporto per la parola chiave new per aggiungere le voci dello slot vtable.Per ulteriori informazioni, vedere nuovo (nuovo slot in vtable) (Estensioni del componente C++).

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

Note

In caso contrario, new restituisce zero o genera un'eccezione; per ulteriori informazioni vedere Gli operatori new e delete. È possibile modificare questo comportamento predefinito scrivendo una routine di gestione delle eccezioni personalizzata e chiamando la funzione della libreria di runtime _set_new_handler con il nome di funzione come relativo argomento.

Per informazioni su come creare un oggetto nell'heap gestito, vedere gcnew.

Quando si utilizza new per allocare memoria per un oggetto della classe C++, il costruttore dell'oggetto viene chiamato dopo che la memoria è stata allocata.

Utilizzare l'operatore delete per deallocare la memoria allocata con l'operatore new.

Nell'esempio viene allocata e successivamente liberata una matrice bidimensionale di caratteri di dimensione dim per 10. Quando si alloca una matrice multidimensionale, tutte le dimensioni eccetto la prima devono essere espressioni costanti che restituiscono valori positivi; la dimensione più a sinistra della matrice può essere una qualsiasi espressione che restituisce un valore positivo. Quando si alloca una matrice utilizzando l'operatore new, la prima dimensione può essere zero e l'operatore new restituisce un puntatore univoco.

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

type-name non può contenere const, volatile, dichiarazioni di classi o dichiarazioni di enumerazioni. Pertanto, la seguente espressione non è valida:

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

L'operatore new non alloca tipi di riferimento perché non sono oggetti.

L'operatore new non può essere utilizzato per allocare una funzione, ma il relativo utilizzo è consentito per allocare i puntatori a funzioni. Nell'esempio seguente viene allocata e successivamente liberata una matrice di sette puntatori a funzioni che restituiscono numeri interi.

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

Se si utilizza l'operatore new senza argomenti aggiuntivi e si esegue la compilazione con l'opzione /GX, /EHa o /EHs, il compilatore genererà il codice per chiamare l'operatore delete se il costruttore genera un'eccezione.

Nell'elenco riportato di seguito sono descritti gli elementi di sintassi dell'operatore new:

  • placement
    Offre un modo per passare argomenti aggiuntivi se si esegue l'overload di new.

  • type-name
    Specifica il tipo da allocare; può essere un tipo incorporato o un tipo definito dall'utente. Se la specifica del tipo è complessa, è possibile racchiuderla tra parentesi per forzare l'ordine di associazione.

  • initializer
    Fornisce un valore per l'oggetto inizializzato. Gli inizializzatori non possono essere specificati per le matrici. L'operatore new creerà matrici di oggetti solo se la classe dispone di un costruttore predefinito.

Esempio

Nell'esempio di codice che segue vengono allocati una matrice di caratteri e un oggetto della classe CName, quindi vengono successivamente liberati.

// 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;
}

Se si utilizza il nuovo form di posizione dell'operatore new, il form con gli argomenti oltre alla dimensione dell'allocazione, il compilatore non supporta un form di posizione dell'operatore delete se il costruttore genera un'eccezione. Ad esempio:

// 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;
}

Vedere anche

Riferimenti

Espressioni con operatori unari

Parole chiave C++

Durata di oggetti allocati con new

Inizializzazione di oggetti allocati con new

Funzionamento di new

Funzione operator new