【編程語言】關於 malloc,calloc,realloc,new 進行動態內存分配的區別

前天面試被問到了這四種內存分配方法的區別,瞬間懵比,半天說不出個所以然,好尷尬。

看來基礎還是不紮實,下來趕緊整理整理,惡補一下。

malloc 函數:void *malloc(unsigned int size)

在內存的動態分配區域申請一塊長度爲 size 的連續空間。如果申請成功,則返回分配空間的首地址,如果不成功,則返 NULL。

申請的內存不會初始化,裏面的值是隨機的不可預知的。

 

calloc 函數:void *calloc(unsigned int num, unsigned int size)

在內存的動態分配區域申請 num 塊長度爲 size 的連續空間,也就是長度爲 num * size 的連續空間。如果申請成功,則返回分配區域的首地址,如果不成功,則返回NULL。

申請到內存空間之後,會自動初始化爲 0。

 

realloc 函數:void* realloc(void* ptr, unsigned newsize)

給已經分配了地址的指針 ptr 重新分配空間, 動態分配一個長度爲 newsize 的連續內存空間。

申請的內存空間不會初始化。

 

new :動態內存分配的運算符

 在動態內存分配時可以自動計算所需要的大小。如果申請成功,會返回指定類型的指針,若不成功,則返回NULL或拋出異常。

 關於初始化,在動態分配類類型時,會調用類的構造函數,對內存空間進行初始化;在動態分配內置類型時,是否初始化取決於後面有沒有括號()。

int *p1 = new int[10];    //僅分配內存空間,不初始化
int *p2 = new int[10]();  //分配內存空間,並初始化爲 0

malloc 和 calloc 的區別

malloc 僅分配內存空間,而不能對內存空間進行初始化。malloc() 函數分配的內存空間,可能是已經被分配使用過的,裏面可能殘存着各種各樣的遺留數據(使用之前需要手動進行初始化)。

而 calloc 在分配內存空間之後,會自動初始化內存空間。如果是爲 int 或 char 類型的元素分配內存,則會將這些元素初始化爲 0;如果是指針類型的元素,則會初始化爲空指針;如果是實型數據(浮點型),則會初始化爲浮點型的 0。

malloc 和 new 的區別

主要有三個方面的區別,內存空間大小,初始化,和返回值。

1. 在動態申請內存空間時,使用 new 可以自動計算需要的空間大小,而使用 malloc 需要自己指定申請的空間大小(如果申請的空間大小不合適,可能會造成數據丟失)。

// 自動分配 100 * sizeof(int) 的內存空間
int *p1 = new int [100]; 

// 需要手動指定申請空間大小爲 sizeof(int) * 100
int *p2 = (int *) malloc (sizeof(int)*100);

2. malloc 申請內存空間時,不會初始化;new 申請內存空間時,自定義類型的元素,會調用構造函數進行初始化,內置類型的元素,如果加(),則顯式調用它的構造函數進行初始化,如果不加(),則僅僅分配內存,不初始化。

3. 使用 malloc 分配內存之後,返回的式 void* 指針,需要顯式地強制轉換成對應類型的指針,否則會報錯。使用 new 分配內存之後,返回指定類型的指針。

// new 分配內存空間之後,返回 int* 類型的指針
int *p1 = new int [100]; 

// 會報錯:“不能將 void* 賦值給 int * 類型變量”
int *p2 = malloc (sizeof(int)*100);

//需要顯式地對 malloc 返回值進行強制轉換
int *p2 = (int *) malloc (sizeof(int)*100);

 

自己總結整理的一些關於 C/C++ 中動態內存分配方面的知識點。

如果有哪裏說的不夠準確,或者有遺漏的地方,希望大家不吝指正!

發佈了53 篇原創文章 · 獲贊 144 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章