首页 新闻 会员 周边 捐助

关于 free() 函数用法的若干疑问

0
[已解决问题] 解决于 2013-09-18 17:35

《C语言参考手册》中关于 free() 函数有如下描述。

(1)free() 函数的原型

        void free(void *ptr);

(2)free 函数对以前由 malloc、calloc、或 realloc 所分配的一块内存区域进行销毁。free 函数的参数必须是与某个内存分配函数的返回值相同的指针。如果它的参数是个 null 指针,则调用这个函数不会产生任何效果。

      既然“如果它的参数是个 null 指针,则调用这个函数不会产生任何效果。”那么为什么一般写成 if(ptr != NULL) free(ptr),而不是直接 free(ptr) 呢?应该不仅是一个书面方面的良好编程风格吧?!

businessman的主页 businessman | 菜鸟二级 | 园豆:204
提问于:2013-09-16 02:15
< >
分享
最佳答案
0

不同的 OS 对 free 的实现可能不一样。

奖励园豆:5
Launcher | 高人七级 |园豆:45050 | 2013-09-16 09:42

但是 free() 函数的这个概念是 C99 标准,这是否说明无论在任何操作系统中都是一样的,因为上面提到的只是 free() 函数的一个概念。

 

不知道您是否能就 OS 不同为什么会导致这个原因再解释一下,谢谢您。

 

感谢您的答复。

businessman | 园豆:204 (菜鸟二级) | 2013-09-16 19:47

@businessman: 我没法给你解释,我不能把所有平台都去测试一遍,你到这个页面看一下:http://curl.haxx.se/download.html,你会发现 OS 太多了,这还不包括嵌入式 OS。另外,这种写法的确是一个良好的习惯,从易读性和性能上来说,它都是最佳做法,实际上,严谨的写法是这样:

                    if(!ptr){free(ptr);ptr=NULL;}

判断会比函数调用花费更少,同时你并不知道 free 内部是如何检查 ptr 参数的;总是将 free 的指针置为 NULL,有助于减少程序的缺陷。

标准是一回事,如何实现标准是另一回事,我不拿C++来说事,就说浏览器,w3c 是有一套 web 标准,但是程序员们还是会天天抱怨浏览器兼容性。

Launcher | 园豆:45050 (高人七级) | 2013-09-17 09:22

@Launcher: 谢谢您耐心的答复。您说的很有道理,我大致明白了。

 

一个简单的问题,经过多次交流,理解更深入了。

businessman | 园豆:204 (菜鸟二级) | 2013-09-17 19:02
其他回答(1)
0

if(ptr != NULL) free(ptr);这个东西产生猜测可能有两个原因,

1.早期C语言还没有标准化的时候需要这样写。

2. 看谭浩强学C语的人主观臆想出来的编程风格。

C语言的标准已经成熟稳定了,没有任何理由不遵循标准来写代码。

增加一次多余的判断没有任何好处,代码体积增加,性能下降。

嗷嗷 | 园豆:757 (小虾三级) | 2013-09-18 12:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册