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"
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für