我们如何能够重新分配内存后访问指针?我们如何能够重新分配内存后访问指针?(How are we ab

2019-05-12 10:20发布

按我的理解,

免费()用于删除我们之前使用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;
}

Answer 1:

你当然可以继续使用p调用后free(p)没有什么会阻止你。 但结果将是完全不确定和不可预测的。 它的工作原理只能碰运气。 这就是所谓的“一个常见的编程错误免费使用后 ”,这在字面几年,许多项目没有“问题”的工作-直到它会导致一个问题。

有一些工具,它们在寻找这样的错误,比如相当不错Valgrind的 。



Answer 2:

访问一个悬摆指针会导致不确定的行为。 悬空指针是被已释放的一个。



Answer 3:

free(p) p是一个悬空指针,其指向任何地方。 free()只是通过释放所分配的存储块malloc()和它不会改变指针指向在该进程的地址空间堆的值。 在某些平台上,如果你试图释放后取消引用指针,你可能会得到段错误。 其良好的做法,如果您分配指针pNULL释放后。



Answer 4:

在大多数系统和标准库, malloc通过分配的存储器从OS更大的块比所需(高达64K在某些系统上),然后在内部从该池发放它按要求进行优化。 这同样适用于解除分配( free )为好,在于,所述free “d内存不释放,但放回内存池,在壳体另一请求时,在这种情况下,池被再利用。

因此,将呼叫free还没有真正释放从进程的地址空间的内存,甚至免费后因此访问。

我为何这样做的理解是,系统调用是昂贵的,所以初始呼叫malloc将使系统调用足够的内存,对于将来的请求malloc不立即触发另一个系统调用更多的内存。

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



文章来源: How are we able to access the pointer after deallocating the memory?