В c++03
довольно ясно, что удаление нулевого указателя не имеет никакого эффекта.В самом деле, в §5.3.5/2
прямо указано, что:
В любой альтернативе, если значением операнда удаления является нулевой указатель, операция не имеет никакого эффекта.
Однако в текущем проекте для c++0x
это предложение, по-видимому, отсутствует.В остальной части проекта я мог только найти предложения, в которых говорилось бы, что происходит, если операнд delete-expression не является константой нулевого указателя.Удаление нулевого указателя все еще определено в c++0x
, и если да, то где?
Примечания:
Существуют значительные косвенные свидетельства того, что он все еще в порядкеопределены.
Во-первых, в §5.3.5/2
есть два предложения о том, что
В первом варианте (объект удаления) значение операнда удаления может быть значением нулевого указателя, ...
и
Во втором варианте (удалить массив) значение операнда удаления может быть значением нулевого указателя или ...
Они говорят, что операнду разрешено быть нулевым, но сами по себе фактически не определяют, что произойдет, если оно есть.
Во-вторых, изменение значения delete 0
являетсясерьезное изменение, и комитет по стандартам вряд ли внесет это конкретное изменение.Кроме того, нет упоминания о том, что это является серьезным изменением в Приложении по совместимости (Приложение C) проекта c++0x
.Приложение C, однако, является информационным разделом, так что это не имеет никакого отношения к интерпретации стандарта.
С другой стороны, тот факт, что удаление нулевого указателя не должно иметь никакого эффекта, подразумевает дополнительное время выполнения.проверять.В большом количестве кода операнд никогда не может быть нулевым, поэтому эта проверка во время выполнения противоречит принципу нулевых издержек.Может быть, комитет просто решил изменить поведение, чтобы привести стандарт c ++ в большее соответствие с заявленными целями разработки языка.