NULL löschen, aber kein Kompilierfehler

7

Ich bin verwirrt, warum der folgende C ++ Code kompilieren kann. Warum erzeugt ein Aufruf zum Löschen der Methode 0 keinen Fehler?!

%Vor%

Ich habe versucht, es auszuführen, und es hat mir überhaupt keinen Fehler gemacht ...

    
cplusplusNewbie 13.10.2009, 03:03
quelle

5 Antworten

19

Die C ++ - Sprache garantiert, dass delete p nichts tut, wenn p gleich ist NULL.

Weitere Informationen finden Sie in Abschnitt 16.8,9 hier :

    
Jacob 13.10.2009, 03:08
quelle
1

Sie können einen Null-Zeiger ohne Probleme löschen, und der Fehler, den Sie möglicherweise haben / haben, wird nicht zur Kompilierungszeit, sondern zur Laufzeit sein.

%Vor%

Normalerweise ist es bequem zu tun:

%Vor%     
Vincent B. 13.10.2009 03:13
quelle
1

Es ist ein De-facto-Standard in C- und C ++ - Sprachen (und nicht nur in ihnen), dass Ressourcen-Deallokations-Routinen Null-Zeiger-Argumente akzeptieren und einfach nichts tun müssen. Eigentlich handelt es sich um eine eher konvenierende Konvention. Also, die wirkliche Frage hier: Warum überrascht es Sie? Was lässt Sie glauben, dass ein Fehler auftreten sollte? Außerdem, was lässt Sie denken, dass es nicht kompilieren ???

BTW, Ihre Frage, die Art, wie es gesagt wird, scheint nicht viel Sinn zu machen, da Ihr Code tatsächlich nicht kompilieren kann. Der angeblichen Zeigerdeklaration fehlt ein Typ, der jeden Compiler veranlasst, eine Diagnosemeldung auszugeben.

    
AnT 13.10.2009 03:27
quelle
0

NULL und 0 sind nicht dasselbe. In C ++ sollten Sie 0 verwenden.

Es gibt keine syntaktisch falsche oder mehrdeutige Löschung des Nullzeigers. In der Tat ist dies per definitionem ein No-Op; Das heißt, die Operation zum Löschen der 0. Adresse ist äquivalent dazu, gar nichts zu tun.

    
wilhelmtell 13.10.2009 03:07
quelle
0

Obwohl Ihr Beispiel trivial ist, gibt es für einen Compiler keine Möglichkeit, den Wert eines Zeigers (zur Kompilierzeit) zu kennen.

Sie können NULL auch zur Kompilierzeit dereferenzieren:

%Vor%

Compiler sind nicht dafür ausgelegt, diese Art von Fehlerbedingungen zum Zeitpunkt der Kompilierung zu behandeln.

Und die meisten (alle?) Implementierungen haben 'delete 0' als Nicht-Operation. Dieser Code sollte gut laufen:

%Vor%

Obwohl ich mir da nicht 100% ig sicher bin:)

    
Josh 13.10.2009 03:08
quelle

Tags und Links