- malloc函數和free函數
- malloc函數原型:void *malloc(long NumBytes)
- malloc原型說明:mallco函數在堆分配了NumBytes個字節的內存空間,用來存放數據,並返回了指向該內存的指針,如果分配失敗,則會返回一個NULL指針(申請到的實際空間要比申請的空間大),該內存空間在malloc函數執行完成后不會被初始化,它的值是未知的,如果希望在分配內存的同時初始化,請使用calloc函數,這在下面會有介紹。
- free函數原型:void free(void *FirstByte)
- free原型說明:free函數的作用就是將用malloc函數申請到的內存空間釋放掉
- 舉個栗子:
1 char* ptr = NULL; 2 //malloc函數的參數表示申請一個可存儲100個char類型的空間 3 //由於malloc函數返回的是一個未知類型指針,所以需要強轉成與自己申請數據匹配的類型 4 //此處強轉為char* 5 ptr = (char*)malloc(100 *sizeof(char)) 6 7 //需要判斷內存空間是否申請成功 8 if (ptr == NULL){ 9 std::cout << “malloc failli.” << std::end; 10 exit(1); 11 } 12 13 //此時內存空間就已經申請成功了 14 15 //接下來就是不再需要這塊內存空間時,需要手動釋放掉,可使用free函數 16 free(ptr); 17 ptr = NULL; 18 //此處在將ptr釋放掉之后還要置0是因為,free只是釋放掉了申請的內存空間中的數據,但是p還是在指向着那塊內存區域,用下面的例子說明會清晰一點 19 int main(){ 20 char *ptr = NULL; 21 ptr = (char*)malloc(100 * sizeof(char)) 22 print(“before free ,p = %p”,ptr);//%p類似於%s表示格式化的字符串,不過%p表示的是指針 23 free(ptr); 24 print(“after free,p = %p”,ptr); 25 26 return 0; 27 } 28 29 //輸出如下: 30 before free,p = 0x8fa7008 31 after free,p = 0x8fa7008 32 //如此可見,free之后只是將內存中釋放,但ptr還是指向那塊內存區域,如果在后續還會對ptr進行判斷的話,就會出現奇奇怪怪的事情 33 //所以在free之后最好還是將其置為NULL
Tip:
- 申請內存空間存在申請失敗的情況,所以在malloc之后需要檢查是否申請成功,判斷指針是否為NULL
- 當不再使用內存時,需要手動釋放掉,free之后要記得將指針置為NULL,以防止后面還會使用
- malloc函數和free函數應該配對使用,申請不釋放會造成內存泄露,要謹記只能釋放一次,如果重復釋放會報錯(空指針除外)
calloc函數:
- 函數原型:void* calloc(size_t num,size_t size);
- 函數說明:calloc函數在內存中動態的分配num個長度為size的連續空間,並將每一個字節都初始化為0,所以該函數是分配了(num*size)個字節長度的空間,並且每一個字節的值都為0.
- 返回值:分配成功則返回指向該內存的地址,分配失敗則返回NULL
- 舉例說明:
1 char *ptr = (chae*)calloc(10,10); 2 //分配10個大小為10字節的連續空間,並將這100個字節都初始化為0
- calloc函數和malloc函數的最大區別就是calloc函數在動態分配內存之后會自動初始化該內存空間為0,而malloc函數不會進行初始化,申請的空間內都是未知的垃圾數據