1. 程式人生 > >關於【動態記憶體】知識點(free崩潰問題)

關於【動態記憶體】知識點(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)