根据我的理解,
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;
}
答案 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 Wikipedia,How do malloc() and free() work?和How is malloc() implemented internally?