2010-08-02 80 views
4

通常,如果一個指針被釋放兩次,它是一個雙重釋放。例如,這是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); 

謝謝。

+0

第二個例子有懸掛指針 – 2010-08-02 16:41:00

回答

10

是的。該庫不關心你的源代碼中給出的變量名稱(在代碼執行時已經過去了)。重要的是價值,在這種情況下,傳遞給free()的值將是相同的。

10

是的。你兩次釋放相同的內存。

+0

(這可能導致一些令人討厭的錯誤和崩潰) – 2010-08-02 16:36:33

0

是的。當您嘗試釋放已釋放的內存塊時,釋放雙倍空間。 ptr和ptr1都指向相同的內存塊,因此第二次調用free時正試圖釋放已釋放的內存塊。

0

是的,因爲指針都指向相同的地址,所以傳遞相同的地址空閒。

可以展示一下指針的值是通過在打印

printf("%p", ptr); 

或看它在調試器

0

是的,這是一個雙自由(和一個非常糟糕的事情) 。 ptr1是一個指向malloc分配的內存的指針。這是ptr指向的位置。通過釋放ptr和ptr1,您可以釋放相同的內存兩次。