在C中释放空指针是否是一种好的做法?

在C中释放空指针是否是一种好的做法?

问题描述:

可能重复:
Does free(ptr) where ptr is NULL corrupt memory?在C中释放空指针是否是一种好的做法?

我正在写释放的指针,如果它是malloc()版C函数。指针可以是NULL(在发生错误的情况下,代码没有机会分配任何内容)或分配到malloc()。使用free(ptr);而不是if (ptr != NULL) free(ptr);安全吗?

gcc根本没有抱怨,即使是-Wall -Wextra -ansi -pedantic,但这是不是很好的做法?

+1

另请参阅:[在免费调用之前检查null](http://stackoverflow.com/questions/1912325/checking-for-null-before-calling-free) – Mat 2011-05-21 20:25:35

+0

重新打开。问题是,***“......这是好的做法”***;而不是*:...它是合法的“*它们是两个不同的问题我有兴趣知道释放空指针的理由,因为没有任何东西可以被释放,在我的脑海中它是没有意义的,它是一个程序错误 – jww 2017-12-22 14:22:34

引述C标准,从7.20.3.2/2 ISO-IEC 9899

void free(void *ptr); 

如果ptr是一个空指针,没有动作发生。

不检查NULL,它只会添加更多的虚拟代码来读取,因此是一种不好的做法。


但是,你必须始终检查NULL指针使用malloc &合作时。在这种情况下,NULL表示出现问题,最有可能是没有内存可用。

+0

我是。我有一个包含指针的结构,我尝试分配它们中的每一个。第一次分配失败时(由malloc()返回的指针是NULL),我调用deallocation函数,它会遍历所有这些函数并释放分配的函数。然后我发出错误信号。有没有更好的方法来做到这一点? – rid 2011-05-22 00:12:25

+0

@rdineiu,假设你在'malloc'调用之前将指针初始化为null(所以你永远不会释放一个未初始化的指针),这是正确的方法。 – 2011-05-22 07:33:08

+3

在这个StackOverflow链接的一些答案: http://stackoverflow.com/questions/1938735/does-freeptr-where-ptr-is-null-corrupt-memory 提到某些C库忽略此标准,并抛出错误,尽管C标准说了什么。可能值得一看。 – 2015-01-14 17:56:15

随机谷歌搜索变成了http://linux.die.net/man/3/free其中规定:

若ptr为NULL,不进行任何操作。

+2

你是对的,但你链接它的网站不太可靠作为参考。它在几个主要C函数的文档上有重大错误。 – 2011-05-21 21:20:06

+1

(希望这会通知)更好? – Hello71 2011-07-19 03:02:00

在我看来,不,至少不是在你的情况。

如果你不能分配内存,你应该在免费调用之前检查这个WAY。

+2

第二段为+1。 – 2011-05-21 21:20:26

+0

我正在检查方式。我有一个包含指针的结构。我尝试分配每个指针。如果在某一点分配失败,我会调用释放函数,该函数循环遍历每个指针并释放它。有没有更好的方法来做到这一点? – rid 2011-05-22 00:08:56

在致电free之前,最好不要打扰检查NULL。检查只会给您的代码添加不必要的混乱,并且free(NULL)保证是安全的。从C99标准的部分7.20.3.2/2:

自由功能使空间ptr指向被解除分配,即,制成 可用于进一步的分配。如果ptr是空指针,则不会发生任何操作。

+0

如果对'free'的调用有开销会怎么样?避免电话会不会更有效率? – jww 2017-12-22 14:23:58

+0

@jww它可能是,但你必须问自己,权衡是否值得。 * common *的情况是,事情不会失败,并且您最终可能会分配内存而不是空指针。如果您无处不在地添加空指针检查,这意味着您现在已经对常见情况的性能产生了负面影响(并且增加了代码的混乱),以避免在非典型故障情况下发生额外的函数调用。 – jamesdlin 2017-12-23 01:28:49

+0

@jww开销在逻辑上不超过'if(ptr == NULL)return;'所以你可以期望通过检查自己来实现双倍的开销! – Persixty 2018-01-14 12:15:53