Удаление нулевого указателя

Возможный дубликат:
Есть ли причина проверять указатель NULL перед удалением?

Я часто вижу в коде следующее:

if(pointer)
    delete pointer;

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


person user987280    schedule 04.11.2011    source источник
comment
Важно помнить, что после удаления он устанавливается NULL.   -  person vrrathod    schedule 04.11.2011
comment
Насколько я понимаю, ваше понимание правильное, но не все люди его разделяют. Но давайте посмотрим, что говорят языковеды.   -  person    schedule 04.11.2011
comment
Удаление нулевого указателя абсолютно безопасно в C++, но не все об этом знают. Это особенно заметно в сообществе C, где язык гарантирует, что free(NULL) не действует, но люди не любят читать стандарты, и интуитивно кажется, что освобождение от NULL может навредить системе. Таким образом, примеров if (p) free(p); в мире С :)   -  person Dan Kruchinin    schedule 04.11.2011
comment
@DanKruchinin, это звучит настолько нелогично, что я лично никогда не проверял стандарт для этого! Но раз уж мы заговорили, можно ли то же самое сказать о kfree и vfree в ядре Linux?   -  person Shahbaz    schedule 04.11.2011


Ответы (4)


delete проверит, является ли указатель NULL для вас, поэтому вы правы, что проверка не нужна.

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

person AusCBloke    schedule 04.11.2011
comment
К вашему комментарию, чтобы вы не делали ничего глупого, например, пытались использовать память, которая больше не ваша, даже разыменование нулевого указателя - это UB. Это полезно в случае, когда указатель снова удаляется (двойное удаление, о котором вы уже упоминали) - person infinite loop; 30.05.2017

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

person Ahmed Masud    schedule 04.11.2011
comment
[citation needed]. Это довольно легко добавить, и IIRC C гарантирует, что free правильно обрабатывает NULL с самого начала (по крайней мере, C89, я не удивлюсь, если это будет и в ANSI C). Поэтому мне трудно поверить, что когда-либо существовала пригодная для использования реализация C++, которая не могла обрабатывать delete NULL;. - person ; 04.11.2011

Чек не нужен.

В документации указано, что удаление "освобождает блок памяти, на который указывает ptr (если не нуль)"

person Cameron Skinner    schedule 04.11.2011

Большинство людей делают это, потому что в противном случае у них обычно есть обработка ошибок (кроме того, что я действительно не вижу смысла выполнять проверку). В некоторых случаях они делают это, чтобы убедиться, что они что-то освобождают, а не случайно где-то меняют указатель и вызывают утечку памяти, не освобождая ее. free(NULL); должен работать во всех случаях и не выдавать ошибок, поэтому, если не задействована обработка ошибок, вы можете удалить оператор if и просто сделать бесплатно.

person Jesus Ramos    schedule 04.11.2011