当你尝试释放()已经释放c中的内存时会发生什么?
例如:
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()
不会导致任何操作。 欲了解更多信息,请参阅: 免费
不那么聪明。 谷歌的双重免费漏洞。 在释放后将指针设置为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; } //?!? :)