假设我通过创建指针p1来动态分配内存:
int *p1 = malloc(10*sizeof(int));
然后我创建第二个指针(p2)并使其指向同一个内存块:
int* p2;
p2 = p1;
然后我想将内存块返回堆中,所以我给出了以下命令:
free(p1);
我的问题是:现在实际上是免费的内存块还是它仍然被占用,因为p2仍指向它(即阻止它)?
答案 0 :(得分:2)
我的问题是:现在实际上是免费的内存块还是它 仍然被占用,因为p2仍指向它(即阻止它)?
不,它已被释放。
此外,在这种情况下你应该小心不要删除内存两次(例如首先通过p1
然后通过p2
) - 否则你将触发未定义的行为。< / p>
实际上这也很有用(C11):
当指向的对象时,指针的值变得不确定 到(或刚刚过去)到达其生命的尽头。
使用不确定的内存是个坏主意。 因此,在释放内存之后,即使这样的事情也是一个坏主意:
free(p1);
if(p2 == NULL) // oops. don't do this
doSmth();
此answer中有更多详细信息。
答案 1 :(得分:2)
一旦它被释放,它就被释放了。
你剩下的是一个悬空指针,你不能再引用它,或者事实上做任何事情。