Warum ist das Löschen des Nullzeigers in C ++ erlaubt?

8

Ich erinnere mich, irgendwo gelesen zu haben, dass es für delete NULL notwendig ist, eine gültige Operation in C ++ zu sein, aber ich kann mich nicht erinnern, warum es so sein sollte. Würde mich bitte jemand daran erinnern?

    
Violet Giraffe 22.09.2012, 06:22
quelle

7 Antworten

11

Die Regel ist nicht unbedingt notwendig, da die Sprache ohne sie existieren könnte ; es ist einfach eine Entscheidung des Normenausschusses. Der Nullzeiger ist keine gültige Speicheradresse. Ich würde jedoch gerne glauben, dass jede Entscheidung aus einem bestimmten Grund getroffen wird und diese Gründe wissenswert sind.

Diese Regel vereinfacht die Verwaltung von Fehlerfällen und anderen Instanzen, in denen ein Zeiger null sein kann. Es ist eine einfache, kostengünstige Prüfung zu machen, und es fügt der Sprache spürbare Bequemlichkeit hinzu.

Wenn beispielsweise viele Bedingungen existieren, die zu einer dynamischen Speicherzuweisung führen würden, andere aber auch existieren, die nicht funktionieren, ist es bequem, am Ende ein delete anzuhängen und sich nicht darum zu kümmern.

%Vor%

Wenn delete nullptr illegal wäre, wäre jeder Aufruf von delete von ... umgeben.

%Vor%

... und das wäre lahm. Da dies die Norm ist, eine im Wesentlichen obligatorische Konvention, warum nicht einfach die Notwendigkeit, vollständig zu überprüfen? Warum benötigen Sie mindestens 5 Zeichen für jeden Aufruf von delete ?

    
Ed S. 22.09.2012, 06:25
quelle
14

Genaue Ursache:

  • Weil C ++ Standard-Ausschuss so entschieden hat.

Mögliche Argumentation:

  • Weil es zu viel Code wäre, um jeden Zeiger auf NULL zu prüfen, bevor delete im Benutzercode aufgerufen wird.
Alok Save 22.09.2012 06:24
quelle
3

Erstens ist NULL niemals ein gültiger Zeigerwert (in einem gehosteten C ++ - Programm), und so gibt es keine Zweideutigkeit, ob der Zeiger auf ein Live-Objekt zeigt oder nicht. Zweitens muss die interne Speicherverwaltungslogik ohnehin ihre eigenen Prüfungen durchführen, um die Buchhaltung durchzuführen, so dass vermutlich nichts davon herrühren würde, dass der Zeiger nicht null ist.

So, jetzt wissen wir, dass gegen diese Regel nichts spricht , hier ist das große Argument: Es macht es viel einfacher, Code zu schreiben. Betrachten Sie diese einfache Ausnahmebehandlungskomponente des Zuordnungscodes:

%Vor%

Das ist einfach und übersichtlich. Wenn wir überall NULL-Checks hinzufügen müssten, würde dies den Code viel weniger lesbar machen und die Logik des Codes verdecken.

    
Kerrek SB 22.09.2012 08:07
quelle
2

Weil das Standard-Komitee weiß, dass das no -Programm NULL auf ein gültiges Objekt zeigen kann, dh NULL kann nicht auf einen gültigen Speicher zeigen, deshalb ist es sicher, delete NULL zu schreiben, genau deshalb, weil es nicht funktioniert t eigentlich alles löschen. Da dies sicher ist, erspart es Ihnen, nach NULL zu suchen, bevor delete :

%Vor%     
Nawaz 22.09.2012 06:30
quelle
2

Weil der Bibliotheksimplementierer nur einmal if (ptr == nullptr) return; schreiben muss. Sie, der Benutzer, müßten es 9999999999 mal in Ihr Programm schreiben. Daher ist es ein einfacher Fall, dass es in delete einfacher ist.

    
Puppy 22.09.2012 08:09
quelle
1

Das Löschen eines Null-Zeigers hat keine Auswirkungen (wenn die Freigabe-Funktion in der Standardbibliothek [2] angegeben ist), muss vor dem Aufruf von delete nicht nach einem Nullzeiger gesucht werden.

Überprüfen Sie auch Ist es sicher, einen NULL-Zeiger zu löschen? es kann dir helfen

    
NullPoiиteя 22.09.2012 06:24
quelle
0

Nun, ich erinnere mich noch genau daran, dass sich die Regeln für das Löschen von Zeiger-zu- const (jetzt OK) mit der Standardisierung geändert haben, d. h. sie waren im ARM, dem Annotated Reference Manual, anders.

Aber ich bin mir nicht sicher, 0 zu löschen; Ich denke, es wurde immer unterstützt.

Wie auch immer, es geht nur um convenience für eine Operation, bei der die Kosten für die Überprüfung unbedeutend sind und wo sie möglicherweise vom Compiler effizienter ausgeführt werden können als von einer benutzerdefinierten Wrapper-Funktion für Löschen.

    
Cheers and hth. - Alf 22.09.2012 07:34
quelle

Tags und Links