关于【动态内存】知识点(free崩溃问题)
free释放动态内存,p不使用,则free(p)释放内存,否则会导致内存泄漏问题
通过以上的存储方式结构图可以看出有头信息、尾信息,而且每一段中间会有空白的一段区域,所以free不需要长度信息。
free崩溃的原因:
①越界(sizeof漏写、realloc第二个值写错等原因)
②修改了指针的指向
③重复释放同一段内存
④释放了非动态内存
①free崩溃情形一(越界)
//情形一(越界) int main() { int *p=(int *)malloc(10*sizeof(int));//申请10个整型单元内存 for(int i=0;i<=10;i++)//11个,越界 { p[i]=0; } free(p); }
②free崩溃情形二(修改指针指向)
//情形二(修改了指针的指向)
int main()
{
int *p=(int *)malloc(10*sizeof(int));//申请10个整型单元内存
for(int i=0;i<10;i++)//未越界,此处依然正确
{
*p=0;
p++;//不free不崩溃
}
free(p);//一free就崩溃了
}
③free崩溃情形三(重复释放内存)
//情形三(重复释放内存)
int main()
{
int *p=(int *)malloc(10*sizeof(int));//p申请10个整型单元内存
for(int i=0;i<10;i++)
{
p[i]=i;
}
int *q=(int *)malloc(20*sizeof(int));//q申请20个整型单元内存
for(i=0;i<10;i++)
{
q[i]=p[i];
}
free(p);
p=q;
q=NULL;
free(p);
free(q);//重复释放了内存
return 0;
}
④free崩溃情形四(释放非动态内存)
//情形四(释放非动态内存) int main() { int arr[10];//定义一个数组arr,10个内存单元 free(arr);//arr不是动态内存,无法释放 }
这条blog和上一条就是关于动态内存问题的汇总啦~可以相互搭配参考着来理解来看哟ヾ(゚∀゚ゞ)
祝大家看完都能ヾ(✿゚▽゚)ノ0 error(s),0 warning(s)