为啥 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 free
ing 内存使其可供重复使用,仅此而已。这并没有给它“任意值”。它只是可供重复使用,并且任何写入它的值 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() 不释放所有分配的内存位置? [复制]的主要内容,如果未能解决你的问题,请参考以下文章