日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

c/c++ 内存动态分配与回收

發布時間:2023/12/19 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 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++ 内存动态分配与回收的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。