簡體   English   中英

malloc 雙重釋放行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM