operatore new (C++)
Alloca memoria per un oggetto o una matrice di oggetti nome del tipo dall'archivio e restituisce liberi un puntatore in modo adeguato tipizzato e diverso da zero all'oggetto.
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
Note
In caso contrario, nuovo restituisce zero o genera un'eccezione; vedere Il nuovo gli operatori e delete per ulteriori informazioni.È possibile modificare questo comportamento predefinito scrivendo una routine personalizzata di gestione delle eccezioni e chiamando _set_new_handler funzione della libreria di runtime con il nome di funzione come argomento.
Per informazioni su come creare un oggetto nell'heap gestito, vedere gcnew.
quando nuovo viene utilizzato per allocare memoria per l'oggetto di una classe C++, il costruttore dell'oggetto viene chiamato dopo che è allocata la memoria.
utilizzare eliminazione operatore per rilasciare la memoria allocata con nuovo operatore.
Nell'esempio alloca e libera una matrice bidimensionale di caratteri di dimensione dim da 10.Per allocare una matrice multidimensionale, tutte le dimensioni eccetto le prime devono essere espressioni costanti che restituiscono valori positivi, la dimensione più a sinistra di matrice può essere qualsiasi espressione che restituisca un valore positivo.Per allocare una matrice utilizzando il nuovo l'operatore, la prima dimensione può essere zero a nuovo l'operatore restituisce un puntatore univoco.
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
nome del tipo non può contenere const, volatile, dichiarazioni di classe, o dichiarazioni di enumerazione.Di conseguenza, la seguente espressione non sono valide:
volatile char *vch = new volatile char[20];
nuovo l'operatore non alloca tipi di riferimento perché non sono oggetti.
nuovo l'operatore non può essere utilizzato per allocare una funzione, ma può essere utilizzata per allocare i puntatori a funzioni.Nell'esempio alloca e libera una matrice di sette puntatori a funzioni che Integer restituita.
int (**p) () = new (int (*[7]) ());
delete *p;
Se si utilizza l'operatore nuovo senza altri argomenti e compilare con /GX, /EHa, o /EHs l'opzione, il compilatore genererà il codice per chiamare l'operatore eliminazione se il costruttore genera un'eccezione.
Nell'elenco seguente vengono descritti gli elementi della grammatica di nuovo:
percorso
Consente di passare gli argomenti aggiuntivi se si esegue l'overload di nuovo.nome del tipo
specifica il tipo da allocare; può essere un incorporato o tipo definito dall'utente.Se la specifica del tipo è complicato, può essere racchiuso tra parentesi per forzare l'ordine di associazione.inizializzatore
fornisce un valore per l'oggetto inizializzato.gli inizializzatori non possono essere specificati per le matrici.nuovo l'operatore crea le matrici di oggetti solo se la classe dispone di un costruttore predefinito.
Esempio
Nell'esempio di codice viene allocata una matrice di caratteri e un oggetto di classe CName e li libera.
// 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 la nuova posizione del form nuovo l'operatore, il form con gli argomenti oltre alla dimensione di, il compilatore non supporta una forma di posizione di l eliminazione operatore se il costruttore genera un'eccezione.Di seguito è riportato un 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 gli operatori unari
Durata degli oggetti allocati da l