關於【動態記憶體】知識點(free崩潰問題)
阿新 • • 發佈:2019-01-26
關於【動態記憶體】知識點(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)