分配给指针的指针和 free() 如何协同工作?
How do pointers assigned to pointers and free() work together?
为什么释放一个指针 say 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 以一种特殊的方式工作。
我想知道为什么会这样。
(我知道 post ,但它没有解释为什么或如何发生这种情况)
也许这会有所帮助:
您没有释放 p
或 q
他们自己 。您正在释放它们指向的 内存块。
在free()
之后,p
和q
本身都继续存在。您不能再取消引用它们,但您可以以其他方式继续使用它们。例如,您可以使它们指向另一个有效地址(之后再次允许取消引用它们)。
之后
int *p = malloc(sizeof(int));
x
+----+
p --------> | |
+----+
P
指向一些 x
内存,其中包含一些垃圾数据。
*p = 10;
您正在将 10
放入 x
x
+----+
p --------> | 10 |
+----+
同下
int *q = malloc(sizeof(int));
y
+----+
q -------> | |
+----+
您又创建了一个 y
指向 q
的内存。
当你赋值时
q = p;
x
+----+
p --------> | 10 |
q --------> +----+
y
+----+
Memory leak | |
+----+
您还让 q
指向 x
内存,丢失了对 y
内存的唯一引用。
随着释放p
free(p);
p --------> (invalidated)
q -------->
y
+----+
Memory leak | |
+----+
您删除了 x
内存,因此 p
和 q
指向释放的内存。
为什么释放一个指针 say 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 以一种特殊的方式工作。
我想知道为什么会这样。
(我知道 post
也许这会有所帮助:
您没有释放 p
或 q
他们自己 。您正在释放它们指向的 内存块。
在free()
之后,p
和q
本身都继续存在。您不能再取消引用它们,但您可以以其他方式继续使用它们。例如,您可以使它们指向另一个有效地址(之后再次允许取消引用它们)。
之后
int *p = malloc(sizeof(int));
x
+----+
p --------> | |
+----+
P
指向一些 x
内存,其中包含一些垃圾数据。
*p = 10;
您正在将 10
放入 x
x
+----+
p --------> | 10 |
+----+
同下
int *q = malloc(sizeof(int));
y
+----+
q -------> | |
+----+
您又创建了一个 y
指向 q
的内存。
当你赋值时
q = p;
x
+----+
p --------> | 10 |
q --------> +----+
y
+----+
Memory leak | |
+----+
您还让 q
指向 x
内存,丢失了对 y
内存的唯一引用。
随着释放p
free(p);
p --------> (invalidated)
q -------->
y
+----+
Memory leak | |
+----+
您删除了 x
内存,因此 p
和 q
指向释放的内存。