проверка ПУСТОЙ УКАЗАТЕЛЬ прежде, чем назвать свободным

Много кодов C, освобождая вызовы указателей:

if (p)
  free(p);

Но почему? Я думал, что в стандарте C говорится free функция не делает ничего данного Нулевая подсказка. Итак, почему другая явная проверка?

22
задан zaharpopov 16 December 2009 в 04:39
поделиться

5 ответов

Конструкция:

free(NULL);

всегда была в порядке в C, вплоть до исходного компилятора UNIX, написанного Деннисом Ритчи. До стандартизации некоторые плохие компиляторы, возможно, не выполнили его правильно, но в наши дни любой компилятор, который этого не делает, не может законно называть себя компилятором для языка C. Его использование обычно приводит к более ясному и удобному в сопровождении коду.

20
ответ дан 29 November 2019 в 04:29
поделиться

I tend to write "if (p) free(p)" a lot, even if I know it's not needed.

I partially blame myself because I learned C the old days when free(NULL) would segfault and I still feel uncomfortable not doing it.

But I also blame the C standard for not being consistent. Would, for example, fclose(NULL) be well defined, I would not have problems in writing:

free(p);
fclose(f);

Which is something that happens very often when cleaning up things. Unfortunately, it seems strange to me to write

free(p);
if (f) fclose(f);

and I end up with

if (p) free(p);
if (f) fclose(f);

I know, it's not a rational reason but that's my case :)

7
ответ дан 29 November 2019 в 04:29
поделиться

Как я поймите, запрет на NULL не всегда присутствовал.

В старые плохие времена C ( 1986, по стандарту до ANSI cc compiler) free (NULL) сбросит ядро. Поэтому большинство разработчиков тестировали NULL / 0 раньше звонит бесплатно.

Мир прошел долгий путь, и он кажется, что нам не нужно делать тестировать больше. Но старые привычки умирают hard;)

http://discuss.joelonsoftware.com/default.asp?design.4.194233.15

13
ответ дан 29 November 2019 в 04:29
поделиться

If you rely on that free(0) is OKAY, and it's normal for your pointer to be null at this point, please say so in comment // may be NULL

This may be merely self-explanatory code, saying yes I know, I also use p as a flag.

0
ответ дан 29 November 2019 в 04:29
поделиться

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

.
1
ответ дан 29 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: