解除内存后,我们如何才能访问指针?

时间:2014-02-26 06:46:55

标签: c pointers malloc free

根据我的理解,

free()用于释放我们之前使用malloc分配的内存。

在我的下面片段中,我释放了我分配的内存。但即使在释放后我也可以访问指针?怎么可能?

内部免费如何运作?

#include<iostream>
using namespace std;

int main()
{
   int *p=(int *)malloc(sizeof(int));
   *p=17;
   free(p);
   *p=*p+1;
   printf("\n After freeing memory :: %d ",*p );
   return 0;
}

4 个答案:

答案 0 :(得分:4)

您可以在致电p后继续使用free(p),但没有任何事情可以阻止您。但是,结果将完全未定义且不可预测。它只适用于运气。这是一个常见的编程错误,称为“use after free”,它可以在许多程序中工作,实际上没有“问题” - 直到它导致问题。

有些工具非常善于发现此类错误,例如Valgrind

答案 1 :(得分:1)

访问dangling pointer将导致未定义的行为。 悬空指针是已经释放的指针。

答案 2 :(得分:1)

free(p)之后,p是悬空指针,指向无处。 free()只释放由malloc()分配的内存块,它不会更改指向该进程地址空间中堆的指针的值。在某些平台上,如果在释放后尝试取消引用指针,则可能会出现段错误。如果在释放后将指针p分配给NULL,这是一种很好的做法。

答案 3 :(得分:1)

在大多数系统和标准库中,malloc通过从操作系统分配比所需更大的内存块(在某些系统上高达64K)进行优化,然后根据此池中的要求在内部进行分配。同样适用于释放(free),因为free'内存未被释放,但放回内存池,以防其他请求进入,其中如果池被重用了。

因此,对free的调用实际上并没有从进程的地址空间中释放内存,因此即使在空闲后也可以访问。

我对于为什么这样做的理解是系统调用很昂贵,因此对malloc的初始调用将使系统调用足够的内存,以便将来malloc的请求不会立即触发另一个系统需要更多内存。

至于进一步阅读,请查看this page on WikipediaHow do malloc() and free() work?How is malloc() implemented internally?