如何释放C中两个指针指向的内存?

时间:2016-12-17 13:53:59

标签: c pointers free

假设我通过创建指针p1来动态分配内存:

int *p1 = malloc(10*sizeof(int));

然后我创建第二个指针(p2)并使其指向同一个内存块:

int* p2; 
p2 = p1;

然后我想将内存块返回堆中,所以我给出了以下命令:

free(p1);

我的问题是:现在实际上是免费的内存块还是它仍然被占用,因为p2仍指向它(即阻止它)?

2 个答案:

答案 0 :(得分:2)

  

我的问题是:现在实际上是免费的内存块还是它   仍然被占用,因为p2仍指向它(即阻止它)?

不,它已被释放。

此外,在这种情况下你应该小心不要删除内存两次(例如首先通过p1然后通过p2) - 否则你将触发未定义的行为。< / p>

实际上这也很有用(C11):

  

当指向的对象时,指针的值变得不确定   到(或刚刚过去)到达其生命的尽头。

使用不确定的内存是个坏主意。 因此,在释放内存之后,即使这样的事情也是一个坏主意:

free(p1);
if(p2 == NULL) // oops. don't do this
  doSmth();

answer中有更多详细信息。

答案 1 :(得分:2)

一旦它被释放,它就被释放了。

你剩下的是一个悬空指针,你不能再引用它,或者事实上做任何事情。