如何释放C中两个指针指向的内存? [复制]
Posted
技术标签:
【中文标题】如何释放C中两个指针指向的内存? [复制]【英文标题】:How to free memory pointed to by two pointers in C? [duplicate] 【发布时间】:2017-05-03 03:07:54 【问题描述】:假设我通过创建指针 p1 来动态分配内存:
int *p1 = malloc(10*sizeof(int));
然后我创建第二个指针 (p2) 并使其指向同一个内存块:
int* p2;
p2 = p1;
然后我想将内存块返回到堆中,所以我给出以下命令:
free(p1);
我的问题是:内存块现在实际上是空闲的还是仍然被占用,因为 p2 仍然指向它(即阻塞它)?
【问题讨论】:
C 不像某些语言那样使用 引用计数,所以如果你free
内存它可以被重用,不管有多少指针指向它。这使得 C 比其他语言快得多 - 也更危险。
【参考方案1】:
我的问题是:内存块现在实际上是空闲的还是它 仍然被占用,因为 p2 仍然指向它(即阻止它)?
不,它已被释放。
此外,在这种情况下,您应该小心不要删除内存两次(例如,首先通过p1
,然后通过p2
)-否则您将触发未定义的行为。
其实这也有用(C11):
当指针指向的对象时,指针的值变得不确定 to(或刚刚过去)达到其生命周期的终点。
而且使用不确定的内存是个坏主意。 所以在释放内存之后,即使是这样的东西也是个坏主意:
free(p1);
if(p2 == NULL) // oops. don't do this
doSmth();
answer 中有更多详细信息。
【讨论】:
【参考方案2】:一旦被释放,它就会被释放。
你剩下的是一个悬空指针,你不能再取消引用它,或者实际上做任何事情。
【讨论】:
有两个悬空指针 是的 - 我的意思是 p2 悬空(其余的......)以上是关于如何释放C中两个指针指向的内存? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
C 语言二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )