例如:
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
先前返回的指针不匹配,或者如果空间已通过调用or被释放,则行为未定义。(ISO 9899:1999 -编程语言 - C,第 7.20.3.2 节)calloc
malloc
realloc
free
realloc
一无所有,无声内存损坏或分段错误。
是的,您可能会收到导致程序崩溃的双重免费错误。它与 malloc 的内部数据结构有关,以跟踪分配的内存。
答案总结:
是的,坏事可能而且很可能会发生。
为了防止这种情况发生:
free(myString);
myString = NULL;
请注意,如果创建了其他内存,则必须将所有对内存的引用设置为NULL
。
free()
此外,使用 a调用NULL
不会导致任何操作。欲了解更多信息,请参阅:男人免费
没那么聪明。谷歌双重免费漏洞。释放后将指针设置NULL
为避免此类错误。
根据你在哪个系统上运行它,什么都不会发生,程序会崩溃,内存会损坏,或者任何其他有趣的效果。
它(可能)使恶魔飞出你的鼻子。
释放后始终将指针设置为 NULL。尝试释放空指针是安全的。
值得编写自己的免费包装器来自动执行此操作。
坏事(TM)
真的,我认为它是未定义的,所以任何事情都包括与 NORAD 的大型机玩“全球热核战争”
不要那样做。如果在对 的调用之间将释放的内存重新分配给其他东西free
,那么事情就会变得一团糟。
它可能会使您的程序崩溃、损坏内存或产生其他更微妙的负面影响。删除内存后,最好将其设置为 NULL (0)。试图释放一个空指针什么都不做,并且保证是安全的。这同样适用于 C++ 中的删除。
简而言之:“未定义的行为”。
(现在,这可以包括什么以及为什么其他人已经说过了。我只是在这里值得一提这个词,因为它很常见)。
下面公认的奇怪宏是一个有用的替代品,可以消除几类安全漏洞并帮助调试,因为访问 free() 的区域更有可能发生段错误,而不是默默地破坏内存。
#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;
}
//?!? :)