当我们尝试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; } //?!? :)