按我的理解,
免费()用于删除我们之前使用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;
}
你当然可以继续使用p
调用后free(p)
没有什么会阻止你。 但结果将是完全不确定和不可预测的。 它的工作原理只能碰运气。 这就是所谓的“一个常见的编程错误免费使用后 ”,这在字面几年,许多项目没有“问题”的工作-直到它会导致一个问题。
有一些工具,它们在寻找这样的错误,比如相当不错Valgrind的 。
访问一个悬摆指针会导致不确定的行为。 悬空指针是被已释放的一个。
后free(p)
p
是一个悬空指针,其指向任何地方。 free()
只是通过释放所分配的存储块malloc()
和它不会改变指针指向在该进程的地址空间堆的值。 在某些平台上,如果你试图释放后取消引用指针,你可能会得到段错误。 其良好的做法,如果您分配指针p
以NULL
释放后。
在大多数系统和标准库, malloc
通过分配的存储器从OS更大的块比所需(高达64K在某些系统上),然后在内部从该池发放它按要求进行优化。 这同样适用于解除分配( free
)为好,在于,所述free
“d内存不释放,但放回内存池,在壳体另一请求时,在这种情况下,池被再利用。
因此,将呼叫free
还没有真正释放从进程的地址空间的内存,甚至免费后因此访问。
我为何这样做的理解是,系统调用是昂贵的,所以初始呼叫malloc
将使系统调用足够的内存,对于将来的请求malloc
不立即触发另一个系统调用更多的内存。
至于进一步阅读,请看看维基百科这个页面 , 如何malloc()和free()的工作? 和如何的malloc()内部实现的?