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


  • Mod

    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;
    

  • Mod

    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


Anmelden zum Antworten