[英]malloc double free behaviour
malloc
的 GNU 手冊頁定義,當free()
使用相同的指針(先前由malloc()
分配free()
調用兩次時,“會發生未定義的行為”。
那是一種什么樣的行為?
在哪里可以找到有關此類錯誤的更多信息?
C99 標准針對未定義的行為(在術語和定義部分)聲明了以下內容:
可能的未定義行為范圍從完全忽略情況並產生不可預測的結果,在翻譯或程序執行期間以環境特征的文件化方式(有或沒有發出診斷消息),到終止翻譯或執行(發出診斷消息)。
總結:任何事情都可能發生。 最壞的情況是程序按預期運行。
“未定義的行為”只是意味着不需要以任何特定方式來處理這種情況; 任何行為或結果都被認為是“正確的”。
多次free
指針的結果取決於malloc
的底層實現; 結果可能是崩潰和核心轉儲,或者它可能會破壞malloc
領域(弄亂未來的分配/釋放),或者它可能會完全忽略雙重free
。
你不能同時釋放兩次相同的指針。
如果您想在沒有未定義行為的情況下執行此類行為。
您可以使用以下宏而不是全部免費的代碼
#define FREE(X) free(X); X=NULL
char *p;
p=malloc(50);
FREE(p);
FREE(p);
當您強制指針為NULL
,這將避免下一次空閑中的未定義行為。 因為free(NULL)
不會導致未定義的行為。
未定義的行為意味着任何事情都可能發生。 可能的結果之一是您的程序運行完美。 另一個可能的結果是您的程序崩潰。 或者你能想到的任何其他東西。
嘗試分析未定義行為的特定實例時,您不會獲得任何洞察力。 補救方法是不要調用free()
兩次。
“未定義行為”通常意味着您的程序會崩潰。 對於 c 庫的實現者來說,這意味着他們可以隨心所欲地處理這種情況。 例如,他們可以免費忽略您的第二個無效免費。 幾乎沒有 c 庫會這樣做。 大多數 c 庫只會因某種內存沖突錯誤而中止您的程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.