Warum funktionieren Pointer nach dem Löschen immer noch?



  • sagt mal:

    wieso ist es eigentlich sinnvoll (bzw nicht vom std vorgeschrieben) dass delete den zeiger nicht automatisch gleich mit auf 0 setzt?



  • Erstens kostet es ein wenig Performance und man bezahlt bekanntlich für nichts, was man nicht braucht.

    Zweitens bekommst du kein konsistentes Verhalten hin:

    int* x = new int;
    int* y = x;
    delete y;    // x == 0?
    


  • Skym0sh0 schrieb:

    wieso ist es eigentlich sinnvoll (bzw nicht vom std vorgeschrieben) dass delete den zeiger nicht automatisch gleich mit auf 0 setzt?

    Wurde doch schon gesagt dass das 0 setzen des Zeigers gefährlich sein kann.
    Warum sollte man das also wollen?

    Nie nie nie den Zeiger 0 setzen. Das fürht zu den blödsten Problemen...



  • Nun, an anderen Stellen hört man es umgekehrt, nämlich, das auf 0 setzen gängige Praxis und es eben nicht gefährlich ist. Scheint wohl so ein Thema zu sein, wo es geteilte Meinungen gibt und jeder selbst entscheiden muss. Aber gut, das war ja auch nicht das eigentlich Thema des Threads.

    Grüßla, x3meblue



  • x3meblue schrieb:

    Nun, an anderen Stellen hört man es umgekehrt,

    Wenn du nicht auf 0 setzt und doppelt löscht stürzt dein Programm garantiert in der Testphase ab und du kannst den Bug fixen. Setzt du aber auf 0, stürtzt es garantiert nicht in der Testphase ab und du shipst den Bug zum Kunden.

    Klar ist es verführerisch auf 0 zu setzen. Das bedeutet weniger entdeckte Bugs in der Testphase, das bedeutet weniger Arbeit. Aber es ist trotzdem eine schlechte Idee.

    Lustigerweise höre ich diese auf 0 setzen Standpunkte nur von C++ Entwicklern. C Entwickler sind mir noch keine untergekommen die das gerne machen...



  • genau so kann man doch argumentieren, dass man auf einen gelöschten noch mal zugreift und es klappt.
    wenn man ihn auf 0 gesetzt hätte, dann hätte es gleich geknallt.

    welcher bug landet denn beim kunden, wenn ich einen zeiger lösche, dann auf 0 stelle und noch mal lösche?

    jenz



  • jenz schrieb:

    welcher bug landet denn beim kunden, wenn ich einen zeiger lösche, dann auf 0 stelle und noch mal lösche?

    Das mag im ersten Moment nicht als Bug erscheinen, aber grundsätzlich deutet es tendenziell auf Fehler oder Probleme hin, wenn man Variablen "recycled". Es mag Stellen geben wo es Sinn macht, dies sollte aber die Ausnahme nicht die Regel sein.

    Zudem ist selbst verwaltete Zeiger eine Gefahrenquelle, häufig sind ("schlanke") Smartpointer die bessere Wahl (Ich spreche hier ausschließlich von der Verwaltung, nicht von ersetzen von Zeigerübergaben etc.).



  • was meinst du mit "recycled"
    a) einen gelöschten pointer 0en und noch mal löschen
    b) einen gelöschten pointer nicht 0en und noch mal benutzen?

    gerade b) würde man durch 0 setzen verhinden.

    sowohl a) als auch b) sollte man natürlich nicht machen. kann aber bestimmt im eifer des gefechts mal passieren.
    wenn, dann sollte es doch gleich in der entwicklungsphase knallen und da sehe ich b) als gefährlicher an als a)

    oder?

    jenz



  • jenz schrieb:

    welcher bug landet denn beim kunden, wenn ich einen zeiger lösche, dann auf 0 stelle und noch mal lösche?

    Du hast einen Logikfehler in deinem Programm. Wenn du hier doppelt aufräumst ist die wahrscheinlichkeit groß, dass du vorher falsch aufgeräumt hast oder jetzt falsch aufräumst. uU wolltest du zB das erste delete ja garnicht und hast nachher noch Daten dorthin geschrieben wo früher das Objekt war und damit dem 0 Zeiger sind die nie geschrieben worden.

    Fakt ist: doppeltes Aufräumen ist ein Logikfehler.
    Weiterer Fakt ist: nur in altem C++ Code wird das versucht wegzudiskutieren. In anderen Sprachen (auch C) wird sowas garnicht erst diskutiert und nie benutzt.

    Es geht dabei nicht darum dass es schlecht ist Variablen zu recyclen - denn Zeiger auf 0 setzen macht durchaus Sinn - nur automatisch mit jedem delete auf 0 setzen ist das Problem.

    Die Denkweise: wenn es nicht abstürtzt ist es korrekt - ist hier das Problem.
    Dabei sind Abstürze gut. Wir wollen Abstürze. Sie helfen Fehler zu finden.



  • okay, genau das meine ich, also das abstürze bei der fehlersuche helfen

    allerdings bin ich mir nicht ganz so sicher, dass es _immer_ ein logikfehler ist, wenn man doppelt löscht.
    aber man kann es auch jedenfall immer so lösen, dass man nicht doppelt löscht.

    jenz



    1. delete Funktion gibts nicht.
    template <typename T>
    void Delete(T* TP)
    {
        delete T;
    }
    

    Tut mir leid, ich konnte mir das nicht verkneifen 😃
    (Achtung Witz !)


Anmelden zum Antworten