当你尝试释放()已经释放c中的内存时会发生什么?

例如:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE); free(myString); free(myString); 

这样做会有不良副作用吗?

这是章节和经文。

如果[对free函数]的参数与之前由callocmallocrealloc函数返回的指针不匹配,或者如果通过调用freerealloc释放了空间,则行为未定义。 ( ISO 9899:1999 – 编程语言 – C ,第7.20.3.2节)

无所事事,无声的内存损坏或分段错误。

是的,您可以获得导致程序崩溃的双重免费错误。 它与malloc的内部数据结构有关,以跟踪分配的内存。

答案摘要:

是的,糟糕的事情可能并且可能会发生。

为了防止这种情况:

 free(myString); myString = NULL; 

请注意,如果创建了其他内存,则必须将对内存的所有引用设置为NULL

此外,使用NULL调用free()不会导致任何操作。 欲了解更多信息,请参阅: 免费

不那么聪明。 谷歌的双重免费漏洞。 在释放后将指针设置为NULL以避免此类错误。

根据您运行它的系统,不会发生任何事情,程序将崩溃,内存将被破坏,或任何其他数量的有趣效果。

释放后始终将指针设置为NULL。 尝试释放空指针是安全的。

值得编写自己的自由包装器来自动执行此操作。

不要那样做。 如果获得释放的内存在free调用之间被重新分配给其他东西,那么事情就会搞砸了。

坏事 (TM)

真的,我认为这是不确定的任何事情,包括与NORAD的主机玩“全球热核战争”

它(可能)使恶魔飞出你的鼻子 。

它可能会使程序崩溃,损坏内存或产生其他更微妙的负面影响。 删除内存后,最好将其设置为NULL(0)。 试图释放空指针什么都不做,并保证是安全的。 对于c ++中的删除也是如此。

简而言之:“未定义的行为”。

(现在,这可以包括什么以及其他人已经说过的原因。我只是值得一提这里的术语,因为它很常见)。

下面这个奇怪的宏是一个有用的替代品,可以消除几类安全漏洞并帮助调试,因为访问free()区域更容易发生段错误而不是无声地破坏内存。

 #define my_free(x) do { free(x); x = NULL; } while (0) 

do-while循环是为了帮助周围的代码更容易地消化多个语句。 例如if(done)my_free(x);

另一个有趣的情况

 char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE); char * yourString = myString; if (myString) { free(myString); myString = NULL; } // Now this one is safe, because we keep to the rule for // setting pointers to NULL after deletion ... if (myString) { free(myString); myString = NULL; } // But what about this one: if (yourString) { free(yourString); yourString = NULL; } //?!? :)