2014-10-07 134 views
-1

我一直在网上和我的高级C类(例如下面的代码)中看到相当多的错误代码。虽然我明白这显然是不好的编码习惯,但我很难做到这一点,除了浪费CPU周期之外,这是非常糟糕的。根据我的理解,如果指针分配不在“malloc表”中(因为缺少更好的单词),通常会忽略它。我会很感激这里的某个人能够让我更好地理解为什么这是糟糕的(除了这是一件愚蠢的事情)以及它的后果。double free()有什么问题?

char* ptr = malloc(1); 

... 

free(ptr); 
... 
free(ptr); 
+7

它只是*未定义的行为*。这意味着你的程序不能被认为是“工作”的。这里没有太多要理解的东西。 – juanchopanza 2014-10-07 06:04:56

+1

如果你想要一个超出一般未定义行为的特定不良行为:如果在第一个'free'返回同一个地址之后再次调用'malloc'会怎么样? – 2014-10-07 06:10:46

+0

^我不明白:S ..那有什么不好? 'malloc,free,malloc,free'?即使对malloc的两次调用返回完全相同的地址,我也认为这是合法的。我无法想出任何错误:S – Brandon 2014-10-07 06:12:42

回答

4

一个很好的建议:免费后废除指针。在你的情况下,你有未定义的行为,因为计算机可以分配内存,这是由ptr指向的内存,或者可能不分配这块内存,或者在碎片整理期间这块内存可能被添加到其他块的内存等。
开另一方面,free(NULL)被定义并且什么也不做。

char* ptr = malloc(1); 
... 
free(ptr); 
ptr = NULL; 
... 
free(ptr); 
+0

啊,我不知道是否定义了空(NULL)。我喜欢这种探索。 – audiFanatic 2014-10-07 06:41:49

+2

很奇怪,这被选为接受的答案。不管是否将释放的指针设置为NULL是一种好的做法,那和free(NULL)与问题无关。 – 2014-10-07 06:47:48

6

这不仅仅是浪费CPU周期。 Double free()undefined behaviour,这意味着允许程序以任意方式运行。

该程序可能正常工作,或者它可能在测试中爆炸,或者它可能会通过所有测试,然后炸毁客户的面部,或者它可能破坏一些数据,或者它可能发起核攻击,所有这些都是未定义行为的有效表现形式。

5

C11,部分7.22.3.3说:

[...]否则,如果该参数不匹配,内存管理 功能早些时候返回一个指针,或如果空间一直通过致电freerealloc解除分配,行为未定义

10

考虑在你的例子后免费(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被释放导致有很多碰撞,疼痛和调试的时间意外的行为..