[英]Freeing dynamically allocated memory to two pointers
我有两个指针,p1 和 p2,它们都指向一个动态分配的 memory - 假设它是一个大小为 16 的 int 数组。
p1 = (int *)malloc(sizeof(int) * 16);
p2 = p1;
如果我执行free(p1)
,它是否会保留动态分配的 memory ,因为 p2 也指的是它,还是只是解除分配 memory,并且指针变得无用(假设我们在那里输入新数据)。
简短的回答:它释放 memory 并且指针指向未分配的 memory 地址。
一点上下文:在C中,memory的动态分配与memory被指针引用的事实无关。 您可以分配一块 memory 但没有被任何指针引用(这称为memory 泄漏,这很糟糕,因为您无法解除分配它),并且您可以有一个指向 ZCD69B4957F06CDDE2198D7 地址的指针未分配。
另一个主题是这对于您不显式分配和取消分配动态 memory 但此任务委托给垃圾收集器的语言如何工作:在这种情况下,垃圾收集器可能不会释放 memory 空间,因为您正在使用另一个指针引用它,因此您可能仍想使用该数据(但这取决于垃圾收集器的逻辑)。
它变得毫无用处。 在free 的手册中,它说:
free()
function 释放了ptr
指向的 memory 空间,该空间必须由先前对malloc()
、calloc()
或realloc()
的调用返回。 否则,或者如果之前已经调用过free(ptr)
,则会发生未定义的行为。 如果 ptr 为NULL
,则不执行任何操作。
可以看到 free 和指针本身没有关系,而是和它指向的那块 memory 有关系,所以如果你在p1
上使用 free ,另一个指针会指向已经被释放的 memory ,也就是说它是无用。
如果您释放p1
,那么您的 memory 将被释放并且不再可用。 p1
的任何副本也是无效的,即使它仍然指向同一个位置,就像p1
本身没有改变,但仍然无法使用一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.