2016-12-17 109 views
0

假設我通過創建指針P1動態分配存儲器:如何釋放C中由兩個指針指向的內存?

int *p1 = malloc(10*sizeof(int)); 

然後,我創建一個第二指針(P 2),並使其指向的存儲器中的相同塊:

int* p2; 
p2 = p1; 

然後我想返回內存塊回堆,所以我給下面的命令:

free(p1); 

我的問題是:是的內存實際上是免費的n塊或者它仍然被佔用,因爲P2仍然指向它(即,阻止它)?

+2

C不會像某些語言那樣使用*引用計數*,所以如果您使用了「空閒」內存,它可以被重用,無論指針有多少指針。這使得C比其他語言更快 - 而且更危險。 – cdarke

回答

2

我的問題是這樣的:現在內存區塊是否真的空了,或者是 仍然被佔用,因爲P2仍然指向它(即阻塞它)?

不,它已被釋放。

而且你應該在這種情況下,注意不要在兩次(例如,第一通過p1然後通過p2)刪除存儲- 否則就會引發未定義的行爲。

實際上這也是有用(C11):

一個指針的值變爲不確定的時它指向的對象 至(或只是過去)達到其壽命的結束。

而使用不確定的內存是一個壞主意。 所以釋放內存,即使這樣的東西之後是一個壞主意:

free(p1); 
if(p2 == NULL) // oops. don't do this 
    doSmth(); 

更多的細節在這answer

2

一旦它被釋放它就會被釋放。

你剩下的是一個懸擺指針你不能再去參考或者事實上做任何事情。

+2

有兩個晃來晃去的指針 –

+0

正確 - 我的意思是P2是懸擺(其餘..) – doctorlove