delete-Operator (C++)

Gibt einen Speicherblock frei.

Syntax

[::] deleteUmwandlungsausdruck
[::] delete []Umwandlungsausdruck

Hinweise

Das Umwandlungsausdruck-Argument muss ein Zeiger auf einen Speicherblock sein, der zuvor einem objekt zugeordnet wurde, das mit dem neuen Operator erstellt wurde. Der delete Operator hat ein Ergebnis vom Typ void und gibt daher keinen Wert zurück. Beispiel:

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

Die Verwendung delete auf einem Zeiger auf ein Objekt, das new nicht zugeordnet ist, führt zu unvorhersehbaren Ergebnissen. Sie können jedoch auf einem Zeiger mit dem Wert 0 verwenden delete . Diese Bereitstellung bedeutet, dass das Löschen des Ergebnisses eines fehlgeschlagenen new Vorgangs, wenn new "0" bei Einem Fehler zurückgegeben wird, harmlos ist. Weitere Informationen finden Sie unter "Die neuen Operatoren und Löschoperatoren".

Die new Operatoren delete und Operatoren können auch für integrierte Typen verwendet werden, einschließlich Arrays. Wenn pointer sich auf ein Array bezieht, platzieren Sie leere Klammern ([]) vor pointer:

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

Wenn Sie den delete Operator für ein Objekt verwenden, werden dessen Speicher zugewiesen. Ein Programm, das einen Zeiger dereferenziert, nachdem das Objekt gelöscht wurde, kann zu unvorhersehbaren Ergebnissen führen oder abstürzen.

Wenn delete zum Behandeln des Speichers für ein C++-Klassenobjekt verwendet wird, wird der Destruktor des Objekts aufgerufen, bevor der Speicher des Objekts zugeordnet wird (wenn das Objekt über einen Destruktor verfügt).

Wenn der Operand für den delete Operator ein modifizierbarer l-Wert ist, wird der Wert nach dem Löschen des Objekts nicht definiert.

Wenn die Compileroption /sdl (Zusätzliche Sicherheitsüberprüfungen aktivieren) angegeben ist, wird der Operand für den delete Operator auf einen ungültigen Wert festgelegt, nachdem das Objekt gelöscht wurde.

Verwenden von "delete"

Es gibt zwei syntaktische Varianten für den Löschoperator: eine für einzelne Objekte und die andere für Arrays von Objekten. Das folgende Codefragment zeigt, wie sie unterschiedlich sind:

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

Die folgenden beiden Fälle erzeugen nicht definierte Ergebnisse: Verwenden der Arrayform des Löschens (delete []) für ein Objekt und Verwenden der nichtarray-Form des Löschens in einem Array.

Beispiel

Beispiele für die Verwendung deletefinden Sie unter "Neuer Operator".

Funktionsweise von „delete“

Der Löschoperator ruft den Löschoperator auf.

Für Objekte, die nicht vom Klassentyp (Klasse, Struktur oder Union) sind, wird der globale Löschoperator aufgerufen. Bei Objekten des Klassentyps wird der Name der Deallocation-Funktion im globalen Bereich aufgelöst, wenn der Löschausdruck mit dem unären Bereichsauflösungsoperator (::) beginnt. Andernfalls ruft der delete-Operator den Destruktor für ein Objekt vor dem Freigeben des Speichers auf (wenn der Zeiger nicht NULL ist). Der delete-Operator kann auf Basis einer einzelnen Klasse definiert werden; wenn keine solche Definition für eine bestimmte Klasse vorliegt, wird der globale delete-Operator aufgerufen. Wenn der Löschausdruck verwendet wird, um ein Klassenobjekt freizugeben, dessen statischer Typ einen virtuellen Destruktor aufweist, wird die Funktion zum Aufheben der Zuordnung vom virtuellen Destruktor des dynamischen Typs des Objekts aufgelöst.

Siehe auch

Ausdrücke mit unären Operatoren
Schlüsselwörter
Operatoren "new" und "delete"