许多C代码释放指针调用:
if (p) free(p);
但为什么?我认为C标准说在free
给定NULL指针的情况下函数不会做任何事情.那为什么要另外明确检查?
构造:
free(NULL);
在C中一直很好,回到Dennis Ritchie编写的原始UNIX编译器.预标准化,一些糟糕的编译器可能没有正确地使用它,但是现在任何编译器都不能合法地称自己为C语言的编译器.使用它通常会产生更清晰,更易于维护的代码.
据我所知,NULL上的no-op并不总是存在.
在C的糟糕时期(早在1986年,在ANSI标准cc编译器之前),free(NULL)会转储核心.因此大多数开发人员在调用free之前都会测试NULL/0.
世界已经走过了漫长的道路,似乎我们不再需要进行测试了.但是老习惯很难;)
http://discuss.joelonsoftware.com/default.asp?design.4.194233.15
我倾向于写" if (p) free(p)
很多",即使我知道它不需要.
我部分地责备自己,因为我学习了C过去的时候free(NULL)
会发生段错误,我还是觉得不舒服.
但我也责怪C标准不一致.例如,fclose(NULL)是否可以很好地定义,我写作时不会遇到问题:
free(p); fclose(f);
在清理东西时经常会发生这种情况.不幸的是,写作似乎很奇怪
free(p); if (f) fclose(f);
我最终得到了
if (p) free(p); if (f) fclose(f);
我知道,这不是一个理性的原因,但这是我的情况:)