釋放空指針
回答
從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. 分配和釋放指針指針
- 3. 指針運算後釋放指針
- 4. 釋放指針算術
- 5. 釋放字符指針
- 6. 釋放空指針數組,釋放第一個元素後崩潰
- 7. 釋放結構與指針和非指針變量
- 8. 在另一個結構中釋放指針內的指針
- 9. 分配給指針的指針:我是否應該釋放它?
- 10. 免費()無效指針 - 釋放指針陣列失敗
- 11. 雙指針的釋放和指針的問題
- 12. 指針釋放和堆內存,C++
- 13. 複製和釋放malloc'ed指針
- 14. 被釋放的指針未被分配
- 15. 關於C指針釋放困惑
- 16. 釋放內存爲包含指針
- 17. 如何釋放boost :: shared_ptr指針?
- 18. 在Bison中出錯後釋放指針
- 19. ç釋放結構指針成員
- 20. 已釋放指針的realloc內存?
- 21. 智能指針釋放FinalRelease明確
- 22. 在C數組的釋放器++指針
- 23. 釋放指針數組的內存?
- 24. 從指針向量中釋放內存
- 25. 釋放分配給指針的內存vs釋放分配給指針指向的內存
- 26. C - 釋放指針數組是否也釋放它們指向的內容?
- 27. 指針值C空指針
- 28. C++指針解釋
- 29. 釋放指向其他結構的結構體中的指針
- 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