new和malloc都是可以用來動态記憶體配置設定,但樓主在多次實習面試中都被問到,以前學習時并沒引起注意,是以上網/看書回顧了這部分知識。自己再整理了一下。
new和malloc的不同點
- malloc是c/c++的标準庫函數,而new是c++的運算符。
- malloc和new申請記憶體空間時,配置設定成功兩者都是傳回指向堆裡面的一塊記憶體;兩者的差別在于配置設定失敗的時候。對于malloc來說,配置設定失敗會傳回一個空指針;對于new來說,配置設定失敗傳回值有兩種,一種是申請時沒有申明nothrow則傳回空指針(如 A a =new A),另一種是申請時申明nothrow則抛出std::bad_alloc異常
- new傳回指定類型的指針,并且可自動計算記憶體大小;malloc需要人工計算記憶體配置設定,并且傳回需要強制轉換。什麼意思呢,我舉個例子
//動态配置設定一個數組 int* p = new int[100]; int* q = (int*)malloc(sizeof(int)*100); /*同樣是配置設定長度為100的整型數組,malloc需要先計算整型的大小再算上100得到最終申請的大小,而且malloc原型為void *malloc(unsigned int num_bytes)傳回是void*指針,void* 表示未确定類型的指針。C,C++規定,void* 類型可以強制轉換為任何其它類型的指針。*/
- malloc隻能進行記憶體配置設定,而不對所得記憶體初始化;new既可以配置設定記憶體,也可以進行初始化(即調用該類型的構造函數)
int* p = (int*)malloc(sizeof(int));//malloc不會初始化
printf("%d\n", *p);
int* q = new int;//這樣new也沒有初始化
printf("%d\n", *q);
int* a = new int();//調用int的無參數構造函數
printf("%d\n", *a);
int* b = new int(10);
printf("%d\n", *b);//答案在下方
new和malloc使用注意
- 申請記憶體空間後,都必須檢查是否配置設定成功(如 if(p!=NULL))
- 不再使用時,記得釋放(malloc配置設定記憶體隻能由free釋放;new配置設定記憶體隻能由delete釋放),并且把該指針指向NULL
- 除了空指針可以釋放多次,其餘隻能釋放一次,釋放多次會出現異常
- new/delete的功能完全覆寫malloc/free,但由于c++常調用c函數,c函數隻能用malloc/free。所有malloc/free依舊保留,并沒有廢除
有什麼不對的,還請大家指出!!