釋放空指針
回答
從C99部7.20.3.2:本自由功能
梗概
1 #include <stdlib.h>
void free(void *ptr);
說明
2所述的自由功能使空間ptr指向到被釋放,也就是製作成 可供進一步分配。 如果ptr是空指針,則不會發生動作。
爲什麼downvote? – 2010-03-01 09:06:11
從http://linux.die.net/man/3/malloc:
若ptr爲NULL,不進行任何操作。
的副本對於那些害怕它是Linux擴展的人來說,這種行爲是由C90標準強制的。 – AProgrammer 2010-03-01 08:56:43
有趣的是,編寫Linux手冊頁的人不明白或不關心'NULL'和「空指針值」之間的區別。大多數嚴肅的和/或正式的文件通常都很迂腐(見其他答案)。 – AnT 2010-03-02 06:47:55
如果我們試圖 釋放其指向 NULL指針內存裏會發生什麼。這是否有效?
什麼都沒有。
爲什麼它不顯示任何警告/錯誤 消息?
首先,行爲是有效的定義,所以不需要發出錯誤或警告。
其次,指針在運行時指向NULL。如何顯示警告或錯誤信息?想象一下,你正在玩一款名爲「殺死殭屍」的遊戲,而其中兩名生物正在攻擊你,出現一個彈出的錯誤消息,說:「警告,空指針釋放。」
它可能是安全的(我不知道,但其他答案似乎暗示),但我不會養成不關心指針是否已經爲空的習慣。隨後的每一次免費的任務p = NULL;
隨即作爲一個必然結果。這在多線程應用程序中是很危險的,因爲在此作業之後,p
可能會被另一個線程使用,並且會被當前線程再次釋放,而其他線程則會被其他線程釋放。
每個malloc的內存都應該釋放一次。期。
應該保護對多線程應用程序中的共享數據的訪問,這將防止您描述的內存泄漏。 – outis 2010-03-01 09:07:36
@outis問題不在於內存泄漏,而是刪除了其他線程期望的數據(可能會導致分段錯誤)。在這種情況下,守衛進入是不夠的。 – 2010-03-01 10:50:33
你提到的線程看起來是正確的,但據我所知,並不適用於這個問題,你不會試圖回答這個問題。 – 2010-03-03 05:43:38
釋放空指針在執行中不起作用。
我會去:
#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
; - ||
首先你可能是指「safe_free」。但是這是什麼意思? 'free(NULL)'是完全合法的。在'free'之前檢查'NULL'沒有意義。 – 2010-03-02 07:02:08
難道你不認識一個笑話(即使拼寫不好)? – 2010-03-02 13:10:17
笑話不同,啓用了警告的Kamailio-SIP-Server http://www.kamailio.org/會在您釋放(0)時發出警告。 – 2010-03-02 13:13:50
很久以前,有一些'free()'的實現在給空指針時崩潰。這隻適用於在C89(C90)標準出廠前還沒有被修改來處理問題的實現。根據我的經驗,這些實現基本上沒有剩下(也不應該有),因此現在可以安全地釋放空指針。
如果你有任何需要移植到極其古怪和古老的系統,那麼也許你應該保持謹慎。另一方面,如果你有這樣的系統需要擔心,那麼你可能會知道這個問題(以及其他一些問題) - 或者會有一些關於代碼的共同知識來表明這一點。
- 1. 釋放空指針
- 2. C - 釋放指針指針
- 3. 釋放指針
- 4. 指針運算後釋放指針
- 5. 分配和釋放指針指針
- 6. xmlTextReaderGetAttribute()後釋放xmlChar指針
- 7. 釋放字符指針
- 8. 釋放會員指針
- 9. 釋放指針::對齊
- 10. 釋放的雙指針
- 11. 釋放字符指針
- 12. 正在釋放指針
- 13. 正在釋放IDispatch指針
- 14. 不能釋放雙指針
- 15. 釋放指針算術
- 16. C++:指向釋放內存空間的指針
- 17. 釋放空指針數組,釋放第一個元素後崩潰
- 18. 如何釋放指向保存地址的指針的指針
- 19. 在另一個結構中釋放指針內的指針
- 20. 是否刪除[]釋放指針分配的內存指針
- 21. 正在釋放的指針未分配給指針
- 22. 釋放結構與指針和非指針變量
- 23. 雙指針的釋放和指針的問題
- 24. 分配給指針的指針:我是否應該釋放它?
- 25. 免費()無效指針 - 釋放指針陣列失敗
- 26. gmtime函數釋放():無效指針
- 27. 被釋放的指針未被分配?
- 28. 釋放字符指針返回錯誤
- 29. 複製和釋放malloc'ed指針
- 30. 釋放內存已遞增指針
沒事; ......仍然,釋放一個非null的指針的行爲是不確定的,通常是災難性的。 – 2010-03-01 11:48:44
指針不是「指向NULL」。指針* * *或* *本身不是null。 「指向NULL的指針」是一個無意義的語句。 – AnT 2010-03-02 02:18:34
如果一個指針正在存儲一個varibale的地址,那麼程序員會說指針指向那個變量是一種慣例,所以它不是一個無意義的語句。可能是我錯了。但它似乎並不是我作爲一個不合情理的陳述。 – Vijay 2010-03-02 04:21:33