繁体   English   中英

将动态分配的 memory 释放到两个指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM