35

例如:

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

这样做有什么副作用吗?

4

14 回答 14

41

这是章节和经文。

如果 [函数] 的参数与、或 函数free先前返回的指针不匹配,或者如果空间已通过调用or被释放,则行为未定义。(ISO 9899:1999 -编程语言 - C,第 7.20.3.2 节)callocmallocreallocfreerealloc

于 2008-09-26T04:59:28.553 回答
19

一无所有,无声内存损坏或分段错误。

于 2008-09-25T19:33:58.053 回答
14

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

于 2008-09-25T19:33:17.947 回答
9

答案总结:

是的,坏事可能而且很可能会发生。

为了防止这种情况发生:

free(myString);
myString = NULL;

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

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

于 2008-09-25T19:44:49.107 回答
6

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

于 2008-09-25T19:34:29.253 回答
5

根据你在哪个系统上运行它,什么都不会发生,程序会崩溃,内存会损坏,或者任何其他有趣的效果。

于 2008-09-25T19:33:45.793 回答
5

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

于 2011-08-28T19:35:22.960 回答
3

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

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

于 2008-09-25T19:36:20.983 回答
3

坏事(TM)

真的,我认为它是未定义的,所以任何事情都包括与 NORAD 的大型机玩“全球热核战争”

于 2008-09-25T19:38:56.873 回答
2

不要那样做。如果在对 的调用之间将释放的内存重新分配给其他东西free,那么事情就会变得一团糟。

于 2008-09-25T19:33:57.273 回答
1

它可能会使您的程序崩溃、损坏内存或产生其他更微妙的负面影响。删除内存后,最好将其设置为 NULL (0)。试图释放一个空指针什么都不做,并且保证是安全的。这同样适用于 C++ 中的删除。

于 2008-09-25T19:42:39.627 回答
1

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

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

于 2008-09-26T04:43:55.207 回答
1

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

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

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

于 2008-09-28T03:35:52.237 回答
-1

另一个有趣的情况:

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;
}

//?!? :)
于 2010-08-26T13:07:46.097 回答