Много кодов C, освобождая вызовы указателей:
if (p)
free(p);
Но почему? Я думал, что в стандарте C говорится free
функция не делает ничего данного Нулевая подсказка. Итак, почему другая явная проверка?
Конструкция:
free(NULL);
всегда была в порядке в C, вплоть до исходного компилятора UNIX, написанного Деннисом Ритчи. До стандартизации некоторые плохие компиляторы, возможно, не выполнили его правильно, но в наши дни любой компилятор, который этого не делает, не может законно называть себя компилятором для языка C. Его использование обычно приводит к более ясному и удобному в сопровождении коду.
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 :)
Как я поймите, запрет на NULL не всегда присутствовал.
В старые плохие времена C ( 1986, по стандарту до ANSI cc compiler) free (NULL) сбросит ядро. Поэтому большинство разработчиков тестировали NULL / 0 раньше звонит бесплатно.
Мир прошел долгий путь, и он кажется, что нам не нужно делать тестировать больше. Но старые привычки умирают hard;)
http://discuss.joelonsoftware.com/default.asp?design.4.194233.15
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.
может быть реализована пользовательская реализация free() в мобильной среде. В этом случае free(0) может вызвать проблему. (да, плохая реализация)
.