作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为什么释放一个指针会说 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 以一种特殊的方式工作。
我想知道为什么会这样。(我知道帖子 Free an assigned pointer ,但它没有解释为什么或如何发生这种情况)
最佳答案
之后
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
指向释放的内存。
关于c - 分配给指针的指针和 free() 如何协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58362084/
我想插入 备注 关于要在我的 latex 文档的特定位置进行的修复 也许有一个 列表的“待办事项/修复我” 你怎么处理这个? 似乎一种方法是使用 fixme 包,但我无法使其工作。 有人在用吗? 最佳
错误:无法创建表。我已经创建了一个数据库,并且已经提供了所有特权。但仍然无法登录协作模块。我受够了,但我不想放弃。我已经尝试了所有可能的方法,但都行不通。 Stackoverflow 是我所知道的最好
我是一名优秀的程序员,十分优秀!