Подтвердить что ты не робот

Можно ли удалить nullptr в С++ 0x?

В c++03 довольно ясно, что удаление нулевого указателя не влияет. В самом деле, в §5.3.5/2 явно указано, что:

В любой альтернативе, если значение операнда удаления является нулевым указателем, операция не имеет эффекта.

Однако в текущем проекте для c++0x это предложение кажется отсутствующим. В остальной части проекта я мог только найти предложения о том, что произойдет, если операнд выражения delete не является константой нулевого указателя. Удаляет нулевой указатель, все еще определенный в c++0x, и если да, где?

Примечания:

Существуют значительные косвенные доказательства того, что они все еще четко определены.

Во-первых, в §5.3.5/2 есть два предложения, в которых указано, что

В первом альтернативе (удалить объект) значение операнда удаления может быть значением нулевого указателя,...

и

Во втором альтернативе (удалить массив) значение операнда удаления может быть значением нулевого указателя или...

Они говорят, что операнду разрешено быть нулевым, но сами по себе не определяют, что произойдет, если оно есть.

Во-вторых, изменение значения delete 0 является серьезным нарушением изменений, и комитет по стандартам вряд ли изменит это конкретное изменение. Более того, упоминание об этом не является изменением в приложении совместимости (Приложение C) проекта c++0x. Однако приложение С является информационным разделом, поэтому это не имеет никакого отношения к толкованию стандарта.

С другой стороны, тот факт, что удаление нулевого указателя не требуется, подразумевает дополнительную проверку во время выполнения. Во множестве кода операнд никогда не может быть нулевым, поэтому эта проверка времени выполнения противоречит принципу нулевой надбавки. Возможно, комитет просто решил изменить поведение, чтобы привести стандартное С++ в соответствие с заявленными целями дизайна языка.

4b9b3361

Ответ 1

5.3.5/7 говорит:

Если значение операнда выражения-удаления не является значением нулевого указателя, выражение-выражение вызовет функцию освобождения (3.7.4.2). В противном случае неясно, будет ли вызвана функция освобождения.

И 3.7.4.2/3 говорит:

Значение первого аргумента, предоставленного функции освобождения, может быть значением нулевого указателя; если это так, и если функция освобождения включена в стандартную библиотеку, вызов не имеет эффекта.

Таким образом, поведение корректно определено, если используется стандартная функция перераспределения, или предоставляемая пользователем функция освобождения правильно обрабатывает нулевые указатели.

Ответ 2

С другой стороны, тот факт, что удаление нулевого указателя не требуется, подразумевает дополнительную проверку времени выполнения.

Новая формулировка не удаляет эту проверку во время выполнения для нулевого указателя. Другое дело: проект стандарта приближается к утверждению, что реализация должна сделать тест с нулевым указателем совместимым.

Также следует отметить: старый стандарт противоречил себе тем, что он сказал (5.3.5/2), что "если значение операнда удаления является нулевым указателем, операция не имеет никакого эффекта", но позже сказал, что (5.3.5/7) "delete-expression будет вызывать функцию освобождения". Вызов функции - это эффект. Это особенно верно, так как вызываемая функция вполне может быть переопределенной operator delete.

Новая формулировка устраняет это противоречие, явно оставляя ее до реализации, вызывается ли функция освобождения при удалении нулевого указателя.