double free()有什么问题?

aud*_*tic 3 c memory free memory-management undefined-behavior

我一直在Web和我的Advanced C类中看到相当多的错误代码(例如下面的代码).虽然我明白这显然是糟糕的编码实践,但我很难知道除了浪费CPU周期之外它做得多么糟糕.根据我的理解,到目前为止,如果指针分配不在"malloc表"中(因为没有更好的单词),通常会被忽略.如果有人在这里可以让我更好地了解为什么这是坏事(除了事实上这是一件很愚蠢的事情)以及它的后果,我会很感激.

char* ptr = malloc(1);

...

free(ptr);
...
free(ptr);
Run Code Online (Sandbox Code Playgroud)

小智 12

在你的例子之后考虑你做了免费(ptr)跟随

char* ptr = malloc(1);

free(ptr) // <-- This will delete the pointer
ptr2 = malloc(1) // <-- now you request again
Run Code Online (Sandbox Code Playgroud)

现在malloc就是这样,并且可以返回与ptr相同的指针,如果确实如此,现在就可以

// if you call me again and if ptr2 == ptr oops!
free(ptr)
Run Code Online (Sandbox Code Playgroud)

- 你的ptr2被释放导致意外的行为,有很多崩溃,痛苦和几小时的调试..

  • 这非常有用,我理解这种担忧。我仍然想知道为什么 `ptr` 甚至有一个值?第二次调用 `free(ptr)` 此时 `ptr` 有什么值?我指的是我们没有专门将其设置为“NULL”的示例...那么,在“free(ptr)”之后,现在“ptr”是什么?我有点菜鸟。我想,仍然缺少更好的要点(或_基础知识_)。 (2认同)

NPE*_*NPE 6

这不仅浪费CPU周期.Double free()未定义的行为,这意味着允许程序以任意方式运行.

该程序可能正常工作,或者它可能会在测试中爆炸,或者它可能会通过所有测试然后在您的客户面前爆炸,或者它可能会破坏某些数据,或者它可能会发动核攻击等等.所有这些是未定义行为的有效表现.


hac*_*cks 6

C11,第7.22.3.3节说:

[...]否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果通过调用freeor 释放了空间realloc,则行为未定义.


Iva*_*nov 5

一个很好的建议:免费后取消指针.在你的情况,你有不确定的行为,因为电脑可以分配内存,这是由ptr指向,也可以不分配这块内存,或该块的内存碎片整理过程中可以添加到其他内存块等
另hand,free(NULL)已定义且不执行任何操作.

char* ptr = malloc(1);
...
free(ptr);
ptr = NULL;
...
free(ptr);
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,这被选为接受的答案.是否将释放的指针设置为NULL是一种好习惯,那和free(NULL)与问题无关. (4认同)