malloc函數、calloc函數和free函數


  • 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函數不會進行初始化,申請的空間內都是未知的垃圾數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM