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

据我了解,

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

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

内部免费如何运作?

#include 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; } 

free(p)拨打电话后你肯定可以继续使用p free(p) ,没有什么可以阻止你。 然而,结果将完全未定义且不可预测。 它只适用于运气。 这是一个常见的编程错误,称为“ 免费使用 ”,它可以在许多程序中使用几年而没有“问题” – 直到它引起问题。

有很多工具可以很好地发现这些错误,比如Valgrind 。

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

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

在大多数系统和标准库中, malloc通过从操作系统分配比所需更大的内存块(在某些系统上高达64K)进行优化,然后根据此池中的要求在内部进行分配。 这同样适用于释放( free ),因为,释放的free内存不会被释放,而是放回内存池中,以防另一个请求进入,在这种情况下池将被重用。

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

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

至于进一步阅读,请查看维基百科上的这个页面 , malloc()和free()如何工作? 以及malloc()是如何在内部实现的?