2010-03-01 194 views
33

如果我們試圖釋放指向NULL的指針,內存中會發生什麼? 是否有效?釋放空指針

它爲什麼不顯示任何警告/錯誤消息?

+0

沒事; ......仍然,釋放一個非null的指針的行爲是不確定的,通常是災難性的。 – 2010-03-01 11:48:44

+9

指針不是「指向NULL」。指針* * *或* *本身不是null。 「指向NULL的指針」是一個無意義的語句。 – AnT 2010-03-02 02:18:34

+0

如果一個指針正在存儲一個varibale的地址,那麼程序員會說指針指向那個變量是一種慣例,所以它不是一個無意義的語句。可能是我錯了。但它似乎並不是我作爲一個不合情理的陳述。 – Vijay 2010-03-02 04:21:33

回答

51

從C99部7.20.3.2:本自由功能

梗概

1 #include <stdlib.h> 
    void free(void *ptr); 

說明

2所述的自由功能使空間ptr指向到被釋放,也就是製作成 可供進一步分配。 如果ptr是空指針,則不會發生動作

+11

爲什麼downvote? – 2010-03-01 09:06:11

15

http://linux.die.net/man/3/malloc

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

+10

的副本對於那些害怕它是Linux擴展的人來說,這種行爲是由C90標準強制的。 – AProgrammer 2010-03-01 08:56:43

+0

有趣的是,編寫Linux手冊頁的人不明白或不關心'NULL'和「空指針值」之間的區別。大多數嚴肅的和/或正式的文件通常都很迂腐(見其他答案)。 – AnT 2010-03-02 06:47:55

3

如果我們試圖 釋放其指向 NULL指針內存裏會發生什麼。這是否有效?

什麼都沒有。

爲什麼它不顯示任何警告/錯誤 消息?

首先,行爲是有效的定義,所以不需要發出錯誤或警告。

其次,指針在運行時指向NULL。如何顯示警告或錯誤信息?想象一下,你正在玩一款名爲「殺死殭屍」的遊戲,而其中兩名生物正在攻擊你,出現一個彈出的錯誤消息,說:「警告,空指針釋放。」

+0

那裏有什麼意思?這個例子讓我想起了Windows,並且與記錄錯誤消息無關。警告的明智決定是將它們輸出到標準錯誤。 – Cheery 2010-03-01 09:14:48

+3

我的觀點很清楚。 「警告」(僅對程序員有用)會干擾正常的程序輸出。 – 2010-03-01 09:36:55

+0

噢,他問爲什麼不顯示*。 :) 我的錯。這是一個奇怪的問題,C中幾乎沒有任何警告或錯誤,沒有程序員檢查錯誤。 – Cheery 2010-03-02 20:05:22

0

它可能是安全的(我不知道,但其他答案似乎暗示),但我不會養成不關心指針是否已經爲空的習慣。隨後的每一次免費的任務p = NULL;隨即作爲一個必然結果。這在多線程應用程序中是很危險的,因爲在此作業之後,p可能會被另一個線程使用,並且會被當前線程再次釋放,而其他線程則會被其他線程釋放。

每個malloc的內存都應該釋放一次。期。

+0

應該保護對多線程應用程序中的共享數據的訪問,這將防止您描述的內存泄漏。 – outis 2010-03-01 09:07:36

+0

@outis問題不在於內存泄漏,而是刪除了其他線程期望的數據(可能會導致分段錯誤)。在這種情況下,守衛進入是不夠的。 – 2010-03-01 10:50:33

+0

你提到的線程看起來是正確的,但據我所知,並不適用於這個問題,你不會試圖回答這個問題。 – 2010-03-03 05:43:38

6

釋放空指針在執行中不起作用。

4

我會去:

#ifdef MY_DOUBTS_HAUNT_ME_IN_MY_DREAMS 
    #define safe_free(x) do { if ((x)) free((x)); } while(0) 
#elseif /* feeling gutsy */ 
    #define safe_free(x) free((x)) 
#endif 

; - ||

+0

首先你可能是指「safe_free」。但是這是什麼意思? 'free(NULL)'是完全合法的。在'free'之前檢查'NULL'沒有意義。 – 2010-03-02 07:02:08

+1

難道你不認識一個笑話(即使拼寫不好)? – 2010-03-02 13:10:17

+1

笑話不同,啓用了警告的Kamailio-SIP-Server http://www.kamailio.org/會在您釋放(0)時發出警告。 – 2010-03-02 13:13:50

5

很久以前,有一些'free()'的實現在給空指針時崩潰。這隻適用於在C89(C90)標準出廠前還沒有被修改來處理問題的實現。根據我的經驗,這些實現基本上沒有剩下(也不應該有),因此現在可以安全地釋放空指針。

如果你有任何需要移植到極其古怪和古老的系統,那麼也許你應該保持謹慎。另一方面,如果你有這樣的系統需要擔心,那麼你可能會知道這個問題(以及其他一些問題) - 或者會有一些關於代碼的共同知識來表明這一點。