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