1. 程式人生 > 其它 >free()一直失敗,程式異常終止

free()一直失敗,程式異常終止

技術標籤:C語言之旅記憶體管理

專案場景:

記憶體的申請和釋放


問題描述:

程式異常終止,控制檯返回值一直為下面的問題,經檢查是一句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),得到的是一個整數的位元組)