malloc後free出錯 (釋放了錯誤的地址空間)
阿新 • • 發佈:2019-01-11
malloc後free出錯
問題
程式malloc後,free時 core dump
源程式如下(舉例):
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *buf;
buf = (int *)malloc(sizeof(int));
buf++;
free(buf);
return 0;
}
出錯資訊如下:
原因分析
指標 buf 的地址在 malloc 之後地址被改變,導致 free 時 free的不是以前的空間,因此出錯。
上面舉例很簡單,意圖也很明顯,buf++ 就是為了說明 buff 地址被改變。
我們日常程式設計中遇到的問題肯定不會這麼明顯,但是程式中很可能就出現了類似的錯誤。比如在取地址時為了取到後面資料,對地址進行了改變。因此才會出現上述錯誤。
這種問題只需要 free 正確的地址就可。
解決方法
程式修改如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *buf;
int *buf_src = NULL;
buf = (int *)malloc(sizeof(int));
buf_src = buf;
buf++;
free(buf_src);
return 0;
}
增加一個指標變數 buf_src,用於儲存原指標 buf 的地址,
現在 free(buf_src),既是對 malloc 時 指標 buf 地址空間的釋放。