c/c++ 内存动态分配与回收
c語言提供內存的動態分配的函數有:
malloc,calloc,realloc。在使用這些函數時,必須包含其頭文件,分別為:<malloc.h>,<stdlib.h>,<alloc.h>
1.malloc函數
malloc函數原型: void *malloc(unsigned int size)
作用:在內存的動態分配區域中分配一個長度為size的連續空間。
類型說明符:void說明該函數適用與任意的數據類型。
參數:size為無符號整型數。
返回值:如果分配成功,則返回所分配內存空間的首地址。如果失敗,則返回NULL。
注:申請的內存不會進行初始化。
例子:
char *p = (char *)malloc(sizeof(char)*10);
//申請了10個char長度的空間,但并不知道是否申請成功。
if(NULL == p)
{
return;//申請內存空間失敗
}
2.calloc函數
calloc函數原型:void *calloc(unsigned int num,unsigned int size)
作用:按照所給的數據個數和數據類型所占字節數,分配一個num*size連續的空間。
類型說明符:void說明該函數適用與任意的數據類型。
參數:num:無符號整數,表示要分配的個數。size:無符號整型數,表示該數據類型所占字節數。
返回值:如果分配成功,則返回內存空間的首地址,如果失敗,則返回NULL。
與malloc函數區別:
calloc申請完內存空間后,會自動初始化內存空間為0。但是malloc不會進行初始化,起內存空間存儲的是一些隨機數據。
例子:
char *p = (char *)calloc(10,sizeof(char));
//申請了10個char長度的內存空間
if(NULL == p)
{
return;//申請內存空間失敗
}
3.realloc函數
realloc函數原型:void *realloc(void *ptr,unsigned int size)
作用:動態分配一個長度為size的內存空間,并把該內存空間的首地址賦值給ptr。把ptr所指的內存空間大小調整為size。
參數:ptr:指向一個內存空間的指針。size:需要的申請的內存空間大小。
返回值:如果分配成功,則返回內存空間的首地址,如果失敗,則返回NULL。
注意:
申請的內存空間不會進行初始化。
如果有足夠空間用于擴大ptr指向的內存塊,則分配額外內存,并返回ptr。這里說的是“擴大”,我們知道,realloc是從堆上分配內存的,當擴大一塊內存空間時, realloc()試圖直接從堆上現存的數據后面的那些字節中獲得附加的字節,如果能夠滿足,自然天下太平。也就是說,如果原先的內存大小后面還有足夠的空閑空間用來分配,加上原來的空間大?。?size。那么就ok。得到的是一塊連續的內存。
如果原先的內存大小后面沒有足夠的空閑空間用來分配,那么從堆中另外找一塊size大小的內存。并把原來大小內存空間中的內容復制到size中,返回新的ptr指針。(數據被移動了)。老塊被放回堆上。
返回值。返回一個void類型指針,則分配成功。如果返回值為NULL,size=0,但是ptr!=NULL,那么原內存就丟失了。如果返回值為NULL,沒有可用的內存,那么ptr所指向的內存空間不變。
特殊情況。如果ptr=NULL,size=0,
例子:
char *p = (char *)malloc(10);
//char *p = "12345";如果使用此語句,執行realloc時會發生錯誤
char *q = p;
p = (char *)realloc(p,100);//如果在p原來指向的內存后面沒有足夠的內存空間來擴展,那么先前分配的10個字節的內存空間被丟棄,即q指針變成了野指針
p[0] = '0';
p = (char *)realloc(p,0);
cout<<p[0]<<endl;//此語句運行時會產生錯誤:非法訪問內存。
在使用c語言提供的這些動態內存分配函數后,對于這些已經申請的內存空間需要你自己進行釋放。如果你沒有釋放,并且你只是隨便運行一下自己的一個很小的程序,可能不會產生什么很大的影響。但是,如果這樣一個大型程序或軟件運行中調用了這些語句,而沒有對申請的內存進行釋放,那么后果是很嚴重的。
因此,在我們平時寫程序的過程中,應該養成好的變成習慣。在使用了這些函數動態分配了一段內存后,要記得對其進行釋放。
釋放的函數為free函數:
free函數原型為:void free(void *ptr)
作用:釋放由上面3種函數所申請的內存空間。
參數:ptr:指向需要釋放的內存空間的首地址。
例子:
char *p = (char *)calloc(10,sizeof(char));
//申請了10個char長度的內存空間
if(NULL == p)
{
return;//申請內存空間失敗
}
...
free(ptr);//釋放申請的內存空間
總結
以上是生活随笔為你收集整理的c/c++ 内存动态分配与回收的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP CRM WebClient UI
- 下一篇: 在SAP HANA Express Ed