Freigeben über


delete-Operator (C++)

Gibt einen Speicherblock frei.

Syntax

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

Hinweise

Das cast-expression-Argument muss ein Zeiger auf einen Speicherblock sein, der vorher einem Objekt zugeordnet wurde, das mit dem new-Operator erstellt wurde. Der delete-Operator weist ein Ergebnis vom Typ void auf und gibt daher keinen Wert zurück. Zum Beispiel:

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

Das Verwenden von delete für einen Zeiger auf ein Objekt, das nicht mit new zugeordnet ist, führt zu unvorhersehbaren Ergebnissen. Sie können delete jedoch für einen Zeiger mit dem Wert 0 (null) verwenden. Diese Bereitstellung bedeutet Folgendes: Wenn new bei einem Fehler 0 (null) zurückgibt, ist das Löschen des Ergebnisses eines new-Vorgangs, bei dem ein Fehler aufgetreten ist, ungefährlich. Weitere Informationen finden Sie unter Die Operatoren new und delete.

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

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

Durch das Verwenden des delete-Operators auf einem Objekt wird dessen Speicher freigegeben. Ein Programm, das einen Zeiger dereferenziert, nachdem das Objekt gelöscht wurde, kann zu unvorhersehbaren Ergebnissen führen oder abstürzen.

Wenn delete verwendet wird, um Arbeitsspeicher für ein C++-Klassenobjekt freizugeben, wird der Destruktor des Objekts aufgerufen, bevor der Speicher des Objekts freigegeben wird (wenn das Objekt einen Destruktor aufweist).

Wenn der Operand für den delete-Operator ein änderbarer lvalue ist, ist dessen Wert nicht definiert, nachdem das Objekt gelöscht wird.

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 delete-Operator: eine für einzelne Objekte und eine für Objektarrays. Das folgende Codefragment zeigt, wie sich diese unterscheiden:

// 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 zwei Fälle führen zu undefinierten Ergebnissen: Verwenden der Arrayform von "delete (delete [])" für ein Objekt und Verwenden der Nichtarrayform von "delete" für ein Array.

Beispiel

Beispiele für die Verwendung von delete finden Sie unter Neuer Operator.

Funktionsweise von „delete“

Der delete-Operator ruft die Funktion operator delete auf.

Für Objekte, die nicht den Klassentyp (class, struct, oder union) aufweisen, wird der globale delete-Operator aufgerufen. Für Objekte des Klassentyps wird der Name der Funktion zum Aufheben der Zuordnung 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.

Weitere Informationen

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