在调用free之前检查NULL

zah*_*pov 22 c

许多C代码释放指针调用:

if (p)
  free(p);
Run Code Online (Sandbox Code Playgroud)

但为什么?我认为C标准说在free给定NULL指针的情况下函数不会做任何事情.那为什么要另外明确检查?

小智 20

构造:

free(NULL);
Run Code Online (Sandbox Code Playgroud)

在C中一直很好,回到Dennis Ritchie编写的原始UNIX编译器.预标准化,一些糟糕的编译器可能没有正确地使用它,但是现在任何编译器都不能合法地称自己为C语言的编译器.使用它通常会产生更清晰,更易于维护的代码.


Tom*_*Tom 13

据我所知,NULL上的no-op并不总是存在.

在C的糟糕时期(早在1986年,在ANSI标准cc编译器之前),free(NULL)会转储核心.因此大多数开发人员在调用free之前都会测试NULL/0.

世界已经走过了漫长的道路,似乎我们不再需要进行测试了.但是老习惯很难;)

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

  • 那天乔尔被引用为技术权威对于人类来说是一个悲伤的日子. (3认同)

Rem*_*o.D 7

我倾向于写" if (p) free(p)很多",即使我知道它不需要.

我部分地责备自己,因为我学习了C过去的时候free(NULL)会发生段错误,我还是觉得不舒服.

但我也责怪C标准不一致.例如,fclose(NULL)是否可以很好地定义,我写作时不会遇到问题:

free(p);
fclose(f);
Run Code Online (Sandbox Code Playgroud)

在清理东西时经常会发生这种情况.不幸的是,写作似乎很奇怪

free(p);
if (f) fclose(f);
Run Code Online (Sandbox Code Playgroud)

我最终得到了

if (p) free(p);
if (f) fclose(f);
Run Code Online (Sandbox Code Playgroud)

我知道,这不是一个理性的原因,但这是我的情况:)