C语言 分配给指针的指针和 free() 如何协同工作?



为什么释放一个指针会说p,它被分配给另一个指针q指向的地方,也会释放q?

//for example,
int *p = malloc(sizeof(int));
*p = 10;
int *q = malloc(sizeof(int));
q = p;
free(p);
//This frees q as well.

指针 q 和 p 具有不同的地址,但仅指向相同的位置(即说它们存储相同的地址,即 10。如果我在那里弄错了,请纠正我(。

矛盾肯定出现在我对指针的思考方式或 free(( 的工作方式中,因为从我所知道的(不是很多(,因为 q 和 p 有不同的地址,释放 p 根本不应该影响 q,除非我在理解指针时错误,或者 free((/memory 以一种特殊的方式工作。

我想知道为什么会这样。 (我知道帖子释放一个分配的指针,但它没有解释为什么或如何发生这种情况(

之后

int *p = malloc(sizeof(int));
x
+----+
p --------> |    |
+----+

P指向一些保存一些垃圾数据的x内存。

*p = 10;

你正在把10投入到x

x
+----+
p --------> | 10 |
+----+

与下面

int *q = malloc(sizeof(int));
y
+----+
q ------->  |    |
+----+

您又创建了一个内存yq指向该内存。

分配时

q = p;
x
+----+
p --------> | 10 |
q --------> +----+
y
+----+
Memory leak |    |
+----+

您也q指向x内存,丢失了对y内存的唯一引用。

具有释放p

free(p);

p -------->  (invalidated)
q --------> 
y
+----+
Memory leak |    |
+----+

您删除了x内存,因此pq指向释放的内存。

也许这会有所帮助:

你不是在解放pq自己。 您正在释放它们指向的内存块

free()之后,pq本身都继续存在。 您无法再取消引用它们,但可以继续以其他方式使用它们。 例如,您可以使它们指向另一个有效的地址(之后将再次允许取消引用它们(。

最新更新