Operatore delete (C++)

Dealloca un blocco di memoria.

Sintassi

[::] deletecast-expression
[::] delete []cast-expression

Osservazioni:

L'argomento cast-expression deve essere un puntatore a un blocco di memoria allocato in precedenza per un oggetto creato con il nuovo operatore. L'operatore delete ha un risultato di tipo void e pertanto non restituisce un valore. Ad esempio:

CDialog* MyDialog = new CDialog;
// use MyDialog
delete MyDialog;

L'uso di delete su un puntatore a un oggetto non allocato con new restituisce risultati imprevedibili. È tuttavia possibile usare delete su un puntatore con il valore 0. Questo provisioning significa che, quando new restituisce 0 in caso di errore, l'eliminazione del risultato di un'operazione non riuscita è innocua new . Per altre informazioni, vedere Operatori nuovi ed eliminati.

Gli new operatori e delete possono essere usati anche per i tipi predefiniti, incluse le matrici. Se pointer fa riferimento a una matrice, posizionare parentesi vuote ([]) prima pointerdi :

int* set = new int[100];
//use set[]
delete [] set;

L'uso dell'operatore delete in un oggetto dealloca la memoria. Un programma che dereferenzia un puntatore dopo l'eliminazione dell'oggetto può ottenere risultati imprevisti o un arresto anomalo.

Quando delete viene usato per deallocare la memoria per un oggetto classe C++, il distruttore dell'oggetto viene chiamato prima che la memoria dell'oggetto venga deallocata (se l'oggetto ha un distruttore).

Se l'operando all'operatore delete è un l-value modificabile, il relativo valore non è definito dopo l'eliminazione dell'oggetto.

Se viene specificata l'opzione del compilatore /sdl (Abilita controlli di sicurezza aggiuntivi), l'operando all'operatore delete viene impostato su un valore non valido dopo l'eliminazione dell'oggetto.

Utilizzo di delete

Esistono due varianti sintattiche per l'operatore delete: una per singoli oggetti e l'altra per le matrici di oggetti. Il frammento di codice seguente mostra le differenze:

// expre_Using_delete.cpp
struct UDType
{
};

int main()
{
   // Allocate a user-defined object, UDObject, and an object
   //  of type double on the free store using the
   //  new operator.
   UDType *UDObject = new UDType;
   double *dObject = new double;
   // Delete the two objects.
   delete UDObject;
   delete dObject;
   // Allocate an array of user-defined objects on the
   // free store using the new operator.
   UDType (*UDArr)[7] = new UDType[5][7];
   // Use the array syntax to delete the array of objects.
   delete [] UDArr;
}

I due casi seguenti producono risultati non definiti: usando la forma di matrice di eliminazione (delete []) in un oggetto e usando la forma nonarray di eliminazione in una matrice.

Esempio

Per esempi di uso deletedi , vedere new operator.

Funzionamento di delete

L'operatore delete richiama l'operatore function delete.

Per gli oggetti non di tipo classe (classe, struct o unione), viene richiamato l'operatore di eliminazione globale. Per gli oggetti di tipo classe, il nome della funzione di deallocazione viene risolto nell'ambito globale se l'espressione delete inizia con l'operatore di risoluzione dell'ambito unario (::). In caso contrario, l'operatore delete richiama il distruttore di un oggetto prima della deallocazione di memoria (se il puntatore non ha valore null). L'operatore delete può essere definito in base alle classi; se non è presente una definizione per una determinata classe, l'operatore delete globale viene richiamato. Se l'espressione delete viene utilizzata per deallocare un oggetto di classe di tipo statico con un distruttore virtuale, la funzione di deallocazione viene risolta dal distruttore virtuale di tipo dinamico dell'oggetto.

Vedi anche

Espressioni con operatori unari
Parole chiave
Operatori new e delete