unterschied zwischen delete und pointer = NULL;



  • Hallo

    hab zu dieser frage in der Forensuche leider nichts gefunden.

    ich hab ein c++ programm, und erschaffe mit new ein paar objekte. Wenn ich aber dann bei der Speicherfreigabe versuche das zu löschen, kommt ne zugriffsverletzung und das programm stürzt genau am delete ab.im debugmodus erhalte ich dann die fehlermeldung dass es ein speicherleak gibt.
    setze ich aber dann statt des delete den zeiger auf NULL, stürzt weder das Prog ab, noch gibts ne memoryleak warnung...
    ich hab aber gehört dass man objekte die man mit new erzeugt mit delete wieder löschen soll...

    mfg



  • Du musst hier 2 Dinge unterscheiden. Den Pointer und das mit new allozierte Objekt. delete wirkt auf das Objekt (und gibt es frei), den Pointer nullzusetzen wirkt auf den Pointer. Du siehst, die 2 Sachen haben nichts miteinander zu tun.

    Kann es sein, dass du ein doppeltes delete machst? Das würde erklären, warum trotz "fehlendem" delete keine Leak-Warnung erscheint (wobei ich nicht weiß, wie dein Leak-Detektor arbeitet.)



  • an ein doppeltes delete hab ich auch schon gedacht, aber im zusammenhang mit diesem objekt gibt bzw. gab es nur eins.
    wird der speicher den das objekt belegt freigegeben (wenn ich nur mit pointer=NULL) arbeite?

    mfg



  • Mit pointer=NULL wird der Speicher nicht freigegeben.



  • sokrates schrieb:

    wird der speicher den das objekt belegt freigegeben (wenn ich nur mit pointer=NULL) arbeite?

    Nein, eben nicht! Der Zeiger merkt sich nur die Adresse, wo das Objekt liegt, wenn du nun sagst, er soll sich NULL merken, existiert das Objekt immer noch. Wenn beim Löschen eine Zugriffsverletzung auftritt, dann wahrscheinlich, weil der Zeiger ungültig ist. Mach einfach eine Abfrage:

    if(pPointer != NULL)
      delete pPointer;
    


  • Till schrieb:

    Wenn beim Löschen eine Zugriffsverletzung auftritt, dann wahrscheinlich, weil der Zeiger ungültig ist. Mach einfach eine Abfrage:

    if(pPointer != NULL)
      delete pPointer;
    

    Dieser Code prüft nicht, ob der Zeiger gültig ist, sondern ob er ein Nullpointer ist. Und da delete auf einen Nullpointer angewandt nichts tut, ist er sogar überflüssig.



  • Na gut, dann dereferenziere den Zeiger einfach und du siehst, ob gültig war, bevor delete angewandt wird. (oder machs in einem Debugger)



  • Bashar schrieb:

    Till schrieb:

    Wenn beim Löschen eine Zugriffsverletzung auftritt, dann wahrscheinlich, weil der Zeiger ungültig ist. Mach einfach eine Abfrage:

    if(pPointer != NULL)
      delete pPointer;
    

    Dieser Code prüft nicht, ob der Zeiger gültig ist, sondern ob er ein Nullpointer ist. Und da delete auf einen Nullpointer angewandt nichts tut, ist er sogar überflüssig.

    der code überprüft ja nicht ob der pointer null ist, sondern nicht null...



  • Ansichtssache.



  • sokrates schrieb:

    Bashar schrieb:

    Till schrieb:

    Wenn beim Löschen eine Zugriffsverletzung auftritt, dann wahrscheinlich, weil der Zeiger ungültig ist. Mach einfach eine Abfrage:

    if(pPointer != NULL)
      delete pPointer;
    

    Dieser Code prüft nicht, ob der Zeiger gültig ist, sondern ob er ein Nullpointer ist. Und da delete auf einen Nullpointer angewandt nichts tut, ist er sogar überflüssig.

    der code überprüft ja nicht ob der pointer null ist, sondern nicht null...

    is doch egal

    long *pPointer = NULL;
    delete pPointer;

    is schliesslich erlaubt


Anmelden zum Antworten