可能重复的问题:
如果ptr是NULL,free(ptr)会损坏内存吗?
我正在编写一段C函数,用于释放已经通过 malloc()
函数分配的内存。指针可以是NULL(例如当出现错误时代码未能分配任何内存),也可以是通过malloc()
分配的。使用free(ptr);
而不是if (ptr != NULL) free(ptr);
是否安全?
gcc
甚至在使用-Wall -Wextra -ansi -pedantic
选项编译时都没有警告,但这样做好不好?
可能重复的问题:
如果ptr是NULL,free(ptr)会损坏内存吗?
我正在编写一段C函数,用于释放已经通过 malloc()
函数分配的内存。指针可以是NULL(例如当出现错误时代码未能分配任何内存),也可以是通过malloc()
分配的。使用free(ptr);
而不是if (ptr != NULL) free(ptr);
是否安全?
gcc
甚至在使用-Wall -Wextra -ansi -pedantic
选项编译时都没有警告,但这样做好不好?
引用C标准,来自ISO-IEC 9899的7.20.3.2/2:
void free(void *ptr);
如果
ptr
是空指针,则不执行任何操作。
不要检查NULL
,这只会增加更多的冗余代码,因此是一种不好的做法。
但是,在使用malloc
等函数时,您必须始终检查NULL
指针。在这种情况下,NULL
表示出了问题,很可能是没有可用内存。
malloc()
返回NULL),我调用释放函数,遍历所有指针并释放已经分配的内存。然后我发出错误信号。有更好的方法吗? - ridmalloc
调用之前将指针初始化为null(因此您永远不会释放未初始化的指针),那么这正是正确的方法。 - David Xfree
会有开销,那么避免调用不是更有效率吗? - jwwfree()
时调用。但我不知道真实的例子。因此,使用实际因素来衡量无效的 free()
调用是检查的6倍,您只有在超过5/6指针是非NULL时才能获胜。当然,在许多应用程序中,指针很少为非NULL。所以从实践角度看,你在2017年12月是正确的。这是一种权衡。 - Persixty