《C语言参考手册》中关于 free() 函数有如下描述。
(1)free() 函数的原型
void free(void *ptr);
(2)free 函数对以前由 malloc、calloc、或 realloc 所分配的一块内存区域进行销毁。free 函数的参数必须是与某个内存分配函数的返回值相同的指针。如果它的参数是个 null 指针,则调用这个函数不会产生任何效果。
既然“如果它的参数是个 null 指针,则调用这个函数不会产生任何效果。”那么为什么一般写成 if(ptr != NULL) free(ptr),而不是直接 free(ptr) 呢?应该不仅是一个书面方面的良好编程风格吧?!
不同的 OS 对 free 的实现可能不一样。
但是 free() 函数的这个概念是 C99 标准,这是否说明无论在任何操作系统中都是一样的,因为上面提到的只是 free() 函数的一个概念。
不知道您是否能就 OS 不同为什么会导致这个原因再解释一下,谢谢您。
感谢您的答复。
@businessman: 我没法给你解释,我不能把所有平台都去测试一遍,你到这个页面看一下:http://curl.haxx.se/download.html,你会发现 OS 太多了,这还不包括嵌入式 OS。另外,这种写法的确是一个良好的习惯,从易读性和性能上来说,它都是最佳做法,实际上,严谨的写法是这样:
if(!ptr){free(ptr);ptr=NULL;}
判断会比函数调用花费更少,同时你并不知道 free 内部是如何检查 ptr 参数的;总是将 free 的指针置为 NULL,有助于减少程序的缺陷。
标准是一回事,如何实现标准是另一回事,我不拿C++来说事,就说浏览器,w3c 是有一套 web 标准,但是程序员们还是会天天抱怨浏览器兼容性。
@Launcher: 谢谢您耐心的答复。您说的很有道理,我大致明白了。
一个简单的问题,经过多次交流,理解更深入了。
if(ptr != NULL) free(ptr);这个东西产生猜测可能有两个原因,
1.早期C语言还没有标准化的时候需要这样写。
2. 看谭浩强学C语的人主观臆想出来的编程风格。
C语言的标准已经成熟稳定了,没有任何理由不遵循标准来写代码。
增加一次多余的判断没有任何好处,代码体积增加,性能下降。