假設我通過創建指針P1動態分配存儲器:如何釋放C中由兩個指針指向的內存?
int *p1 = malloc(10*sizeof(int));
然後,我創建一個第二指針(P 2),並使其指向的存儲器中的相同塊:
int* p2;
p2 = p1;
然後我想返回內存塊回堆,所以我給下面的命令:
free(p1);
我的問題是:是的內存實際上是免費的n塊或者它仍然被佔用,因爲P2仍然指向它(即,阻止它)?
假設我通過創建指針P1動態分配存儲器:如何釋放C中由兩個指針指向的內存?
int *p1 = malloc(10*sizeof(int));
然後,我創建一個第二指針(P 2),並使其指向的存儲器中的相同塊:
int* p2;
p2 = p1;
然後我想返回內存塊回堆,所以我給下面的命令:
free(p1);
我的問題是:是的內存實際上是免費的n塊或者它仍然被佔用,因爲P2仍然指向它(即,阻止它)?
我的問題是這樣的:現在內存區塊是否真的空了,或者是 仍然被佔用,因爲P2仍然指向它(即阻塞它)?
不,它已被釋放。
而且你應該在這種情況下,注意不要在兩次(例如,第一通過p1
然後通過p2
)刪除存儲- 否則就會引發未定義的行爲。
實際上這也是有用(C11):
一個指針的值變爲不確定的時它指向的對象 至(或只是過去)達到其壽命的結束。
而使用不確定的內存是一個壞主意。 所以釋放內存,即使這樣的東西之後是一個壞主意:
free(p1);
if(p2 == NULL) // oops. don't do this
doSmth();
更多的細節在這answer。
C不會像某些語言那樣使用*引用計數*,所以如果您使用了「空閒」內存,它可以被重用,無論指針有多少指針。這使得C比其他語言更快 - 而且更危險。 – cdarke