当你尝试释放()已经释放c中的内存时会发生什么?
-
02-07-2019 - |
题
例如:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
这样做是否有任何不良副作用?
解决方案
这是章节和经文。
如果[到
free
函数]的参数与之前由calloc
,malloc
返回的指针不匹配,或者realloc
函数,或者如果通过调用free
或realloc
释放空间, 行为未定义。 ( ISO 9899:1999 - 编程语言— C ,第7.20.3.2节)
其他提示
无所不知,无声内存损坏或分段错误。
是的,您可以获得导致程序崩溃的双重免费错误。它与malloc的内部数据结构有关,以跟踪分配的内存。
答案摘要:
是的,坏事可能也可能会发生。
为了防止这种情况:
free(myString);
myString = NULL;
请注意,如果创建了其他内容,则必须将对内存的所有引用设置为 NULL
。
此外,使用 NULL
调用 free()
会导致无法执行操作。有关详细信息,请参阅:免费提供人员
不那么聪明。谷歌提供双重免费漏洞。在释放后将指针设置为 NULL
以避免此类错误。
根据您运行它的系统,不会发生任何事情,程序将崩溃,内存将被破坏,或任何其他数量的有趣影响。
释放后始终将指针设置为NULL。 尝试释放空指针是安全的。
值得编写自己的免费包装器来自动执行此操作。
它(可能)使恶魔飞出你的鼻子。
不要那样做。如果释放的内存在 free
的调用之间被重新分配给其他东西,那么事情就会搞砸了。
糟糕的事情(TM)
真的,我认为这是不确定的,所以包括玩“全球热核战争”等等。与NORAD的大型机
它可能会导致程序崩溃,内存损坏或其他更微妙的负面影响。删除内存后,最好将其设置为NULL(0)。尝试释放空指针什么都不做,并保证是安全的。对于c ++中的删除也是如此。
简而言之:“未定义的行为”。
(现在,这可以包括什么以及其他人已经说过的原因。我只是值得一提这里的术语,因为它很常见)。
下面公认的奇怪的宏是消除一些安全漏洞以及帮助调试的有用替代品,因为访问free()区域更容易发生段错误而不是无声地破坏内存。 / p>
#define my_free(x) do { free(x); x = NULL; } while (0)
do-while循环是为了帮助周围的代码更容易地消化多个语句。例如if(done)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;
}
//?!? :)