当你尝试释放()已经释放c内存时会发生什么?
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
是否有这样做的任何不良副作用?
这是章节和经文。
如果参数[到
free
功能]不匹配由calloc
,malloc
,或realloc
功能早些时候返回一个指针,或者如果空间已释放通过调用free
或realloc
, 的行为未定义。 (ISO 9899:1999 - Programming languages — C,第7.20.3.2)
是的,你可以得到一个双重的免费错误,导致你的程序崩溃。它与malloc的内部数据结构有关,以跟踪分配的内存。
根据你运行的系统,什么都不会发生,程序会崩溃,内存将被破坏,或者其他任何有趣的效果。
不要这样做。如果将释放的内存重新分配给free
调用之间的其他内容,则事情会变得混乱。
其中之一,无声的内存损坏或分段错误。
hrm,你从哪里得到的? 我得到双重免费错误... – 2009-10-23 07:38:06
当您访问超出界限的内存时,Segfaults发生。 – Mahouk 2016-05-19 06:43:51
不那么聪明。 Google提供双倍免费漏洞。释放后将您的指针设置为NULL
以避免此类错误。
不幸的是,你不能编写一个包装来释放它,这是为你做的,指针是通过值而不是引用传递的。即Free(void ** p){free(* p); * p = NULL;}这不容易重新使用代码。 – jbleners 2008-09-25 19:40:31
ajbl,使用宏。 #define freep(x)(free(x); x = 0;) – 2008-09-25 19:46:39
坏主意,因为它不适用于const值。你尽可能使用const值,不是吗? – 2008-11-30 14:47:03
释放它后总是将指针设置为NULL。 尝试释放空指针是安全的。
这是值得写你自己的免费包装自动做到这一点。
坏事(TM)
真的,我认为这是不确定的,所以,只要在所有包括扮演“全球热核战争”,与NORAD的大型机
可能你的程序崩溃,破坏内存,或有其他更微妙的负面影响。删除内存后,最好将其设置为NULL(0)。试图释放一个空指针什么也不做,并且保证是安全的。在C++中删除也是如此。
回答摘要:
是的,坏的事情可能会发生,也可能会发生。
为了防止这种情况吗:
free(myString);
myString = NULL;
请注意,如果其他人创建的,在内存中的所有引用必须设置为NULL
。
此外,调用free()
与NULL
结果不采取任何行动。欲了解更多信息,请参阅:man free
总之:“未定义的行为”。
(现在,它可能包含什么,以及为什么这是其他人已经说过的情况,我只是在这里值得一提,因为它很常见)。
下诚然奇怪宏是一个有用的简易替代用于擦拭出安全漏洞以及辅助调试的几类,因为访问以释放()'D区是更有可能发生段错误而不是默默地破坏记忆。
#define my_free(x) do { free(x); x = NULL; } while (0)
do-while循环将帮助周围的代码更容易地消化多重语句。例如如果(完成)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;
}
//?!? :)
即使内存未在两次调用之间重新分配以释放,事情通常也会搞砸。 – 2008-10-24 06:09:51