delete und delete[]
-
Hallo,
ich muss doch damit alle DeKonstruktoren aufgerufen werden delete[] verwenden.Ist es eigentlich tragisch wenn ich immer delete[] benutze ?
Muss ich vor dem "delete" prüfen ob dem Zeiger jemals ein Heap zugeordnet wurde oder mach das delete automatisch ?danke
gruss
Marcus
-
Hi,
grundsätzlich gilt, wenn du Speicher mit new anforderst, dann wird der mit delete gelöscht. Forderst du Speicher mit new[] an, dann musst du ihn auch mit delete[] löschen!
Ein delete 0; macht einfach gar nichts, dass heißt wenn du deine Zeiger Anfangs immer auf 0 setzt, dann kannst du gefahrlos delete für diese aufrufen!Nochmal kurz ein wenig Code:
int *EinObjekt = new int; int *MehrereObjekte = new int[10]; int *NullPointer = 0; int *Ohje; delete EinObjekt; delete[] MehrereObjekte; delete NullPointer; //Es passiert nichts delete Ohje; //Hier wird mit aller Wahrscheinlichkeit krachen!KaPtainCugel
-
- statt DeKonstruktoren heißt das Destruktoren
- wenn Du ein Objekt mit new anlegst, dann löscht Du es mit delete
- wenn Du ein Array mit new[] anlegst, dann löscht Du es mit delete[]Wenn Du versuchst ein NULL-Objekt per delete zu löschen, dann passiert nix (AFAIK)
// typo
-
Okay, danke für die schnelle Antworten.
D.h. solange ich meine Zeiger immer mit :
pZeiger = 0 oder NULL;
Intializiere kann ich diese immer Gefahrenlos mit
delete[] pZeiger;
löschen egal ob heap reserviert oder nicht und egal ob new[] oder nicht.
gruss
Marcus
-
KPC schrieb:
Ein delete 0; macht einfach gar nichts, dass heißt wenn du deine Zeiger Anfangs immer auf 0 setzt, dann kannst du gefahrlos delete für diese aufrufen!
das gilt allerdings nur für die deallokationsfunktionen der standard-bibliothek, ein selbstdefinierter operator delete (bzw. delete[]) darf sich anders verhalten. auch deshalb kann es sinnvoll sein, zuerst den zu löschenden pointer auf 0 zu testen; ganz nebenbei kann das zusätzliche optimierungsmöglichkeiten schaffen.
-
Sehe die Frage noch nicht ganz beantwortet, ob man immer delete[] verwendne darf:
T* objPtr = new T; delete [] objPtr;
-
templäd schrieb:
Sehe die Frage noch nicht ganz beantwortet, ob man immer delete[] verwendne darf:
T* objPtr = new T; delete [] objPtr;das hat undefiniertes verhalten zur folge. die form des delete muss zum verwendeten new passen.
-
camper schrieb:
KPC schrieb:
Ein delete 0; macht einfach gar nichts, dass heißt wenn du deine Zeiger Anfangs immer auf 0 setzt, dann kannst du gefahrlos delete für diese aufrufen!
das gilt allerdings nur für die deallokationsfunktionen der standard-bibliothek, ein selbstdefinierter operator delete (bzw. delete[]) darf sich anders verhalten. auch deshalb kann es sinnvoll sein, zuerst den zu löschenden pointer auf 0 zu testen; ganz nebenbei kann das zusätzliche optimierungsmöglichkeiten schaffen.
Eine eigene Deallokationsfunktion sollte das verhalten für Nullzeiger nachahmen.
grüße