Все еще безопасно удалить nullptr в C ++ 0x? - PullRequest
68 голосов
/ 18 июля 2011

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

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

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

Примечания:

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

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

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

и

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

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

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

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

Ответы [ 2 ]

85 голосов
/ 18 июля 2011

5.3.5 / 7 говорит:

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

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

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

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

5 голосов
/ 18 июля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...