free()一直失敗,程式異常終止
阿新 • • 發佈:2020-12-31
專案場景:
記憶體的申請和釋放
問題描述:
程式異常終止,控制檯返回值一直為下面的問題,經檢查是一句free()語句的問題。
Process returned -1073741819 (0xC0000005)
原因分析:
malloc分配的空間的空間出現了問題,一些標誌資訊被修改,可能是分配空間打下不夠。
經檢查,錯誤在於把sizeof(size)當成了大小,而不是size
解決方案:
刪除多餘的sizeof()即可
收穫
記憶體的釋放和申請一定是成對的,有一個申請就要對應一個釋放。
如果是申請了一個結構體的記憶體,又用這個結構體內的指標申請了一片記憶體,則釋放時後者也要釋放而且還要先釋放。不釋放後者的話程式可能可以執行,但會有記憶體洩漏,軟體所佔記憶體越來越大。
以codeblocks執行為例,都釋放的話一個程式一直穩定在12.5M左右:
而如果,不釋放後分配的,記憶體會越來越大,下圖是執行幾分鐘的記憶體,就已經是原來的4倍了!!!:
從這裡也有一個簡單的檢查記憶體洩漏的方式,開啟工作管理員看程式的記憶體是不是一直在增大,當執行時間比較長,程式的記憶體增大的很厲害。
例項程式碼:
typedef struct frame{
char *data;
int size;
}FRAME,*PFRAME;
PFRAME creat_frame(char* data,int size){
PFRAME pf=(PFRAME)malloc(sizeof (FRAME));
pf->size=size;
pf->data=(char *)malloc(size);
for(int i=0;i<size;i++){
pf->data[i]=data[i];
}
return pf;
}
int main(){
PFRAME data=creat_frame(a,size);
free(data->data);
data->data=NULL;
free(data);
data=NULL;
}
如果想寫一個釋放結構體的函式,要看是否要改變指標的值確定傳的引數是指標的地址還是指標。
特別注意點,一定要檢查malloc()中給的是一個size,還是一個size的size(即使用sizeof(size),得到的是一個整數的位元組)