2011-05-21 55 views
50

可能重複:
Does free(ptr) where ptr is NULL corrupt memory?在C中釋放空指針是否是一種好的做法?

我正在寫釋放的指針,如果它是malloc()版C函數。指針可以是NULL(在發生錯誤的情況下,代碼沒有機會分配任何內容)或分配到malloc()。使用free(ptr);而不是if (ptr != NULL) free(ptr);安全嗎?

gcc根本沒有抱怨,即使是-Wall -Wextra -ansi -pedantic,但這是不是很好的做法?

+1

另請參閱:[在免費調用之前檢查null](http://stackoverflow.com/questions/1912325/checking-for-null-before-calling-free) – Mat 2011-05-21 20:25:35

+0

重新打開。問題是,***「......這是好的做法」***;而不是*:...它是合法的「*它們是兩個不同的問題我有興趣知道釋放空指針的理由,因爲沒有任何東西可以被釋放,在我的腦海中它是沒有意義的,它是一個程序錯誤 – jww 2017-12-22 14:22:34

回答

107

引述C標準,從7.20.3.2/2 ISO-IEC 9899

void free(void *ptr); 

如果ptr是一個空指針,沒有動作發生。

不檢查NULL,它只會添加更多的虛擬代碼來讀取,因此是一種不好的做法。


但是,你必須始終檢查NULL指針使用malloc &合作時。在這種情況下,NULL表示出現問題,最有可能是沒有內存可用。

+0

我是。我有一個包含指針的結構,我嘗試分配它們中的每一個。第一次分配失敗時(由malloc()返回的指針是NULL),我調用deallocation函數,它會遍歷所有這些函數並釋放分配的函數。然後我發出錯誤信號。有沒有更好的方法來做到這一點? – rid 2011-05-22 00:12:25

+0

@rdineiu,假設你在'malloc'調用之前將指針初始化爲null(所以你永遠不會釋放一個未初始化的指針),這是正確的方法。 – 2011-05-22 07:33:08

+3

在這個StackOverflow鏈接的一些答案: http://stackoverflow.com/questions/1938735/does-freeptr-where-ptr-is-null-corrupt-memory 提到某些C庫忽略此標準,並拋出錯誤,儘管C標準說了什麼。可能值得一看。 – 2015-01-14 17:56:15

5

隨機谷歌搜索變成了http://linux.die.net/man/3/free其中規定:

若ptr爲NULL,不進行任何操作。

+2

你是對的,但你鏈接它的網站不太可靠作爲參考。它在幾個主要C函數的文檔上有重大錯誤。 – 2011-05-21 21:20:06

+1

(希望這會通知)更好? – Hello71 2011-07-19 03:02:00

4

在我看來,不,至少不是在你的情況。

如果你不能分配內存,你應該在免費調用之前檢查這個WAY。

+2

第二段爲+1。 – 2011-05-21 21:20:26

+0

我正在檢查方式。我有一個包含指針的結構。我嘗試分配每個指針。如果在某一點分配失敗,我會調用釋放函數,該函數循環遍歷每個指針並釋放它。有沒有更好的方法來做到這一點? – rid 2011-05-22 00:08:56

17

在致電free之前,最好不要打擾檢查NULL。檢查只會給您的代碼添加不必要的混亂,並且free(NULL)保證是安全的。從C99標準的部分7.20.3.2/2:

自由功能使空間ptr指向被解除分配,即,製成 可用於進一步的分配。如果ptr是空指針,則不會發生任何操作。

+0

如果對'free'的調用有開銷會怎麼樣?避免電話會不會更有效率? – jww 2017-12-22 14:23:58

+0

@jww它可能是,但你必須問自己,權衡是否值得。 * common *的情況是,事情不會失敗,並且您最終可能會分配內存而不是空指針。如果您無處不在地添加空指針檢查,這意味着您現在已經對常見情況的性能產生了負面影響(並且增加了代碼的混亂),以避免在非典型故障情況下發生額外的函數調用。 – jamesdlin 2017-12-23 01:28:49

+0

@jww開銷在邏輯上不超過'if(ptr == NULL)return;'所以你可以期望通過檢查自己來實現雙倍的開銷! – Persixty 2018-01-14 12:15:53

相關問題