通常,如果一個指針被釋放兩次,它是一個雙重釋放。例如,這是C中的雙倍免費嗎?
char *ptr;
ptr=malloc(5 * sizeof(*ptr));
free(ptr);
free(ptr);
上述代碼被認爲是雙重免費的。下列內容也被認爲是免費的嗎?
char *ptr;
char *ptr1;
ptr=malloc(5 * sizeof(*ptr));
ptr1=ptr;
free(ptr);
free(ptr1);
謝謝。
通常,如果一個指針被釋放兩次,它是一個雙重釋放。例如,這是C中的雙倍免費嗎?
char *ptr;
ptr=malloc(5 * sizeof(*ptr));
free(ptr);
free(ptr);
上述代碼被認爲是雙重免費的。下列內容也被認爲是免費的嗎?
char *ptr;
char *ptr1;
ptr=malloc(5 * sizeof(*ptr));
ptr1=ptr;
free(ptr);
free(ptr1);
謝謝。
是的。該庫不關心你的源代碼中給出的變量名稱(在代碼執行時已經過去了)。重要的是價值,在這種情況下,傳遞給free()
的值將是相同的。
是的。你兩次釋放相同的內存。
(這可能導致一些令人討厭的錯誤和崩潰) – 2010-08-02 16:36:33
是的。當您嘗試釋放已釋放的內存塊時,釋放雙倍空間。 ptr和ptr1都指向相同的內存塊,因此第二次調用free
時正試圖釋放已釋放的內存塊。
是的,因爲指針都指向相同的地址,所以傳遞相同的地址空閒。
可以展示一下指針的值是通過在打印
printf("%p", ptr);
或看它在調試器
是的,這是一個雙自由(和一個非常糟糕的事情) 。 ptr1是一個指向malloc分配的內存的指針。這是ptr指向的位置。通過釋放ptr和ptr1,您可以釋放相同的內存兩次。
第二個例子有懸掛指針 – 2010-08-02 16:41:00