C++經典面試題 | malloc和new的區別?

解題思路

(1)malloc和new都是在堆上開闢內存的
malloc只負責開闢內存,沒有初始化功能,需要用戶自己初始化;new不但開闢內存,還可以進行初始化,如new int(10);表示在堆上開闢了一個4字節的int整形內存,初始值是10,再如new int[10] ();表示在堆上開闢了一個包含10個整形元素的數組,初始值都爲0。
(2)malloc是函數,開闢內存需要傳入字節數,如malloc(100);表示在堆上開闢了100個字節的內存,返回void*,表示分配的堆內存的起始地址,因此malloc的返回值需要強轉成指定類型的地址;new是運算符,開闢內存需要指定類型,返回指定類型的地址,因此不需要進行強轉。
如堆上開闢int整形:

int *p1 = (int*)malloc(sizeof(int));   
=>  根據傳入字節數開闢內存,沒有初始化

int *p2 = new int(0); 
=>  根據指定類型int開闢一個整形內存,初始化爲0

int *p3 = (int*)malloc(sizeof(int)*100);  
=>  開闢400個字節的內存,相當於包含100個整形元素的數組,沒有初始化

int *p4 = new int[100]();  
=>  開闢400個字節的內存,100個元素的整形數組,元素都初始化爲0  

(3)malloc開闢內存失敗返回NULL,new開闢內存失敗拋出bad_alloc類型的異常,需要捕獲異常才能判斷內存開闢成功或失敗,new運算符其實是operator new函數的調用,它底層調用的也是malloc來開闢內存的,new它比malloc多的就是初始化功能,對於類類型來說,所謂初始化,就是調用相應的構造函數。
(4)malloc開闢的內存永遠是通過free來釋放的;而new單個元素內存,用的是delete,如果new[]數組,用的是delete[]來釋放內存的。
詳細使用規則參照我的上一篇博客 https://blog.csdn.net/weixin_39411321/article/details/89310651
(5)malloc開闢內存只有一種方式,而new有四種分別是普通的new(內存開闢失敗拋出bad_alloc異常), nothrow版本的new,const new以及定位new。

注意這裏 : 如果問到malloc,還有可能問你memcpy等,realloc函數能不能在C++中使用,絕對不能,因爲這些函數進行的都是內存值拷貝(也就是對象的淺拷貝),會發生淺拷貝這個嚴重的問題!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章