为啥 free() 不释放所有分配的内存位置? [复制]

Posted

技术标签:

【中文标题】为啥 free() 不释放所有分配的内存位置? [复制]【英文标题】:Why does not free() deallocate all allocated memory locations? [duplicate]为什么 free() 不释放所有分配的内存位置? [复制] 【发布时间】:2016-10-19 17:01:58 【问题描述】:

我不知道是我做错了什么,还是我的概念有些错误

#include<stdio.h>
#include<stdlib.h>

int main()

     int *p;
     p=calloc(3,sizeof(int));
     p[0]=10;
     p[1]=15;
     p[2]=30;
     printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2);
     free(p);
     //p=NULL;
     printf("\n%d\n%p\n%d\n%p\n%d\n%p\n\n",p[0],p,p[1],p+1,p[2],p+2);
     return 0;

当第二次运行 printf() 时,它显示 p[2]=30,而 p[0]=p[1]=0(在 gcc ubuntu 和 Code::Blocks 窗口中的一些任意值)。我有 2 个问题。

    为什么 free() 释放前 2 个指针而不是第 3 个。一个? 为什么在 ubuntu 中显示任意值似乎正确,但值却显示为 0?

我是初学者,请多多包涵。我用 malloc() 尝试过同样的事情,同样的事情发生了。

【问题讨论】:

free 释放内存。但它并没有神奇地消失。它只是还没有被另一个进程或函数重用。而且没有 3 个指针,只有 1 个。 如果内存真的是空闲的()-d p[3] 如何保留它的原始值?我同意这是未定义的行为,因此它应该给出任意值,对吧? @StephenStemmer 任意定义。 @StephenStemmer freeing 内存使其可供重复使用,仅此而已。这并没有给它“任意值”。它只是可供重复使用,并且任何写入它的值 then 对所有意图而言都是任意的,就您继续使用而言。部分或全部可能已在printf 内重新分配。但推测是没有用的。 呵呵,确实有任意值。你怎么知道它是否是任意的? 【参考方案1】:

使用已经被free()-d 调用的内存调用undefined behavior。 不要那样做。

引用 C11,附件 §J.2,未定义的行为

指向通过调用 free 或 使用realloc函数。

详细地说,在指针上调用 free() 不会将指针设置为 NULL 或其他任何内容。它只是将内存标记为内存管理器可重用。该内存位置(指针)对于程序不再有效,所以你不应该使用它。

作为对上述问题的预防措施,在调用free() 后显式设置指向NULL 的指针被认为是一种良好的编码习惯。但是,FWIW,这不是强制

引用C11,第 7.22.3.3 章

free函数使ptr指向的空间被释放,也就是使 可用于进一步分配。 [...]

另外,只是补充一点,无论如何,部分free() 是不可能通过调用free() 来实现的。你可以refer to this previous answer for clarification。

【讨论】:

因此,在释放指针后,您应该始终将它们设置为 null。 @Tyler 不是强制要求,而是一种好的做法,我同意。 :)

以上是关于为啥 free() 不释放所有分配的内存位置? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 malloc() 和 free() 后,两个内存位置会发生变化?

为啥 free() 并没有真正释放内存?

为啥我们要在 free() 释放内存后清空指针? [复制]

C语言free释放内存后为啥指针里的值不变?竟然还可以输出

为啥反复分配和释放内存会耗尽系统所有内存?

为啥不需要释放静态数组?