Почему не удалить установить указатель на NULL? - PullRequest
118 голосов
/ 01 апреля 2009

Мне всегда было интересно, почему автоматическая установка указателя на NULL после delete не является частью стандарта. Если об этом позаботятся, многие сбои из-за неверного указателя не произойдут. Но, сказав, что я могу придумать пару причин, по которым стандарт ограничил бы это:

  1. Производительность:

    Дополнительная инструкция может замедлить производительность delete.

  2. Может быть из-за const указателей.

    Тогда, опять же, стандарт мог бы что-то сделать для этого особого случая.

Кто-нибудь знает точные причины, по которым это запрещено?

Ответы [ 12 ]

3 голосов
/ 01 апреля 2009

Установка указателя на NULL автоматически не решит большинство проблем с неправильным использованием указателя. Единственный сбой, которого можно избежать, - это попытка удалить его дважды. Что если вы вызовете функцию-член для такого указателя? Это все еще падало бы (предполагая, что это обращается к переменным-членам). C ++ не ограничивает вас от вызова какой-либо функции по указателям NULL и не должен делать это с точки зрения производительности.

0 голосов
/ 05 апреля 2016

Я вижу людей, которые дают странные ответы на этот вопрос.

ptr = NULL; Как такое простое утверждение может привести к задержке производительности?

Другой ответ говорит, что у нас может быть несколько указателей, указывающих на один и тот же место в памяти. Конечно, мы можем. В этом случае операция удаления для одного указателя будет делать только этот указатель NULL (если удаление делало указатель равным NULL), а другой указатель будет отличным от NULL и указывает на свободное место в памяти.

Решением для этого должно было быть то, что пользователь должен удалить все указатели, указывающие на одно и то же местоположение. Внутренне он должен проверить, свободна ли память, чем не освободить. Только сделать указатель NULL.

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

...