我一直在Web和我的Advanced C类中看到相当多的错误代码(例如下面的代码)。虽然我明白这显然是糟糕的编码实践,但我很难知道除了浪费CPU周期之外它做得多么糟糕。根据我的理解,到目前为止,如果指针分配不在“malloc表”中(因为没有更好的单词),通常会被忽略。如果有人在这里可以让我更好地了解为什么这是坏事(除了事实上这是一件很愚蠢的事情)以及它的后果,我会很感激。
char* ptr = malloc(1);
...
free(ptr);
...
free(ptr);
答案 0 :(得分:11)
在自由(ptr)之后的例子中考虑一下
char* ptr = malloc(1);
free(ptr) // <-- This will delete the pointer
ptr2 = malloc(1) // <-- now you request again
现在malloc就是这样,可以返回与ptr相同的指针,如果确实如此,现在你可以
// if you call me again and if ptr2 == ptr oops!
free(ptr)
- 你的ptr2被释放导致意外行为,造成大量崩溃,痛苦和数小时的调试......
答案 1 :(得分:6)
这不仅浪费CPU周期。 Double free()
为undefined behaviour,这意味着允许程序以任意方式运行。
该程序可能运行得很好,或者它可能会在测试中爆炸,或者它可能会通过所有测试然后在您的客户面前爆炸,或者它可能会损坏某些数据,或者它可能会启动所有这些都是未定义行为的有效表现。
答案 2 :(得分:6)
C11,第7.22.3.3节说:
[...]否则,如果参数与先前由内存管理返回的指针不匹配 函数,或如果通过调用
free
或realloc
释放了空格,则行为未定义。
答案 3 :(得分:5)
一个好的建议:免费后取消指针。在您的情况下,您有未定义的行为,因为计算机可以分配由ptr指向的内存,或者可能不分配这块内存,或者在碎片整理期间可以将这块内存添加到其他内存块中。
另一方面,定义了free(NULL)并且什么都不做。
char* ptr = malloc(1);
...
free(ptr);
ptr = NULL;
...
free(ptr);