In c++03
es ist ziemlich klar , dass ein Null - Zeiger zu löschen hat keine Wirkung. In der Tat wird ausdrücklich darauf hingewiesen §5.3.5/2
:
In beiden Alternativen hat die Operation keine Auswirkung, wenn der Wert des Operanden "Löschen" der Nullzeiger ist.
Im aktuellen Entwurf für c++0x
diesen Satz scheint jedoch zu fehlen. Im Rest des Entwurfs konnte ich nur Sätze finden, die angeben, was passiert, wenn der Operand des Löschausdrucks nicht die Nullzeigerkonstante ist. Ist das Löschen des Nullzeigers noch definiert in c++0x
und wenn ja, wo?
Anmerkungen:
Es gibt signifikante Indizien dafür, dass es immer noch gut definiert ist.
Erstens gibt es die zwei Sätze §5.3.5/2
, die das besagen
In der ersten Alternative (Objekt löschen) kann der Wert des Operanden von delete ein Nullzeigerwert sein, ...
und
Bei der zweiten Alternative (Array löschen) kann der Wert des Operanden delete ein Nullzeigerwert sein oder ...
Diese besagen, dass der Operand null sein darf, definieren aber allein nicht, was passiert, wenn dies der Fall ist.
Zweitens ist eine Änderung der Bedeutung von delete 0
eine wesentliche Änderung, und es ist sehr unwahrscheinlich, dass das Normungsgremium diese spezielle Änderung vornimmt. Darüber hinaus wird nicht erwähnt, dass dies eine bahnbrechende Änderung im Kompatibilitätsanhang (Anhang C) des c++0x
Entwurfs ist. Anhang C ist jedoch ein informativer Abschnitt, daher hat dies keinen Einfluss auf die Auslegung der Norm.
Andererseits impliziert die Tatsache, dass das Löschen des Nullzeigers keine Auswirkung haben muss, eine zusätzliche Laufzeitprüfung. In vielen Codes kann der Operand niemals null sein, daher steht diese Laufzeitprüfung im Widerspruch zum Null-Overhead-Prinzip. Vielleicht hat das Komitee gerade beschlossen, das Verhalten zu ändern, um Standard-C ++ besser an die angegebenen Designziele der Sprache anzupassen.