2014-10-07 132 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被釋放導致有很多碰撞,疼痛和調試的時間意外的行爲..