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

时间:2020-03-06 14:44:37  来源:igfitidea点击:

例如:

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

这样做有任何不利的副作用吗?

解决方案

是的,我们会得到一个双重释放错误,导致程序崩溃。它与malloc的内部数据结构有关,以跟踪分配的内存。

根据运行它的系统,什么都不会发生,程序将崩溃,内存将被破坏或者其他数量的有趣效果。

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

什么都没有,无声内存损坏或者分段错误。

不太聪明。 Google具有双重免费漏洞。释放后将指针设置为" NULL",以避免此类错误。

释放指针后,务必将其设置为NULL。
尝试释放空指针是安全的。

值得编写自己的免费包装程序以自动执行此操作。

坏事(TM)

真的,我认为这是不确定的,因此包括在NORAD的大型机上玩"全球热核战争"在内的一切都没有

它可能会导致程序崩溃,内存损坏或者产生其他更细微的负面影响。删除内存后,最好将其设置为NULL(0)。尝试释放空指针没有任何作用,并且可以保证是安全的。对于c ++中的删除也是如此。

答案摘要:

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

为防止这种情况发生,请执行以下操作:

free(myString);
myString = NULL;

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

同样,用NULL调用free()不会导致任何动作。有关更多信息,请参见:man free

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

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

这是本章和经文。

If the argument [to the free function] does not match a pointer earlier returned by the calloc, malloc, or
  realloc function, or if the space has been deallocated by a call to free or realloc,
  the behavior is undefined. (ISO 9899:1999 - Programming languages — C, Section 7.20.3.2)

下面公认的奇怪宏是一种有用的嵌入式替换,可消除几类安全漏洞并进行调试,因为对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;
}

//?!? :)