例如:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
这样做会有任何不良副作用吗?
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
这样做会有任何不良副作用吗?
以下是具体规定:
如果传递给
free
函数的参数与之前由calloc
,malloc
或realloc
函数返回的指针不匹配,或者所释放的空间已经被free
或realloc
调用释放,则行为未定义。(ISO 9899:1999 - C编程语言,第7.20.3.2节)
其中之一是没有内容,另一种是静默内存损坏,还有一种是分段错误。
是的,你可能遇到双重释放错误导致程序崩溃。这与malloc内部的数据结构有关,用于跟踪已分配的内存。
答案概述:
是的,不好的事情可能会发生。
为了防止这种情况发生,请执行以下操作:
free(myString);
myString = NULL;
NULL
。NULL
调用free()
不会产生任何作用。有关更多信息,请参见:man free。不太聪明。谷歌搜索双重释放漏洞。释放后将指针设置为NULL
,以避免此类错误。
free
函数是无效的(从概念上和形式上都是如此,除非你强制转换去掉限定符)吧? :-) - R.. GitHub STOP HELPING ICEchar *const ptr = malloc(STRING_BUFFER_SIZE); ... ; free(ptr);
。我认为这既不是形式上也不是概念上无效的。之后,ptr = 0;
也不可能了。因此,如果您像Derek所说定义了一个宏freep
,那么您不能在ptr
上使用它。 - Steve Jessop根据运行的系统不同,可能会发生以下情况:什么也不会发生、程序将崩溃、内存将被破坏或其他有趣的影响。
坏事情(TM)
实际上,我认为这是未定义的,因此可以包括与NORAD主机玩“全球热核战争”等任何事情。
在释放指针后,始终将其设置为NULL。尝试释放空指针是安全的。
值得编写自己的free包装器以自动执行此操作。
不要这样做。如果在调用free
之间将被释放的内存重新分配给其他内容,则会出现混乱。