关于【动态内存】知识点(free崩溃问题)

关于【动态内存】知识点(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)


猜你喜欢

转载自blog.csdn.net/VVVv_0427/article/details/80041819