如何释放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语言free释放内存后为啥指针里的值不变?竟然还可以输出

C/C++——指针

通过指向常量的指针释放内存是一种好习惯吗

C 语言二级指针作为输入 ( 自定义二级指针内存 | 为 二级指针 分配内存 - 存放 一维指针 | 为每个 一级指针 分配内存 | 释放二维指针内存 )

关于C语言free函数的问题