關於new和malloc區別的總結

2021-09-25 20:23:18 字數 1501 閱讀 8868

new和malloc都是常用的申請動態記憶體方式。他們有以下區別:

1、malloc / free 是c語言的標準庫函式,new/delete是c++的運算子(或者說關鍵字);

2、new/delete比malloc/free更智慧型,在申請和釋放記憶體時會自動呼叫物件的建構函式和析構函式(其底層仍靠malloc/free來實現),malloc則只管分配記憶體並不對所得的記憶體初始化;

3、返回型別不同,new返回的是指定型別的指標,且自動計算所需記憶體的大小,malloc返回的是 void* 型,需要手動進行資料型別轉換,且記憶體大小需要手動計算;

如:int *pint_n = new int[10];//返回型別為 int* 型,申請記憶體大小為 sizeof(int)*10;

int *pint_m = (int *)malloc(10 * sizeof(int)); //返回的是 void* 型,需手動強轉為 int* 型

4、如果申請記憶體失敗,表現形式不同,malloc申請記憶體失敗後返回空指標null,new申請失敗則丟擲異常,直接比較指標是否為空是沒有意義的,需要用try、catch的方式捕獲異常;

5、處理陣列的方式不一樣,c++提供了new,delete,可以通過建構函式和析構函式來逐個處理陣列元素,malloc和free則不區分陣列還是普通物件,更為佛系。

注意

int *p = null;

try

catch(bad_alloc& a)

std::set_new_handler(badallocatehandler);

badallocatehandler是程式設計師自己寫的當分配失敗時的處理函式。而set_new_handler是c++提供的機制。一般來說當山窮水盡的時候你所應該做的事只有兩件。要麼讓程式退出,要麼想辦法從別的地方挖一些記憶體來繼續分配。

new是乙個關鍵字。而對於乙個程式來說,一切的動作都將回到函式呼叫。

所以new的時候到底發生了什麼呢?

當new的時候,首先程式會去呼叫::operator new()這個函式。然後::operator new()中程式會去呼叫malloc()。喔!一切都明了了,原來new的本質也是去呼叫malloc函式。同理,delete的本質是去呼叫free()函式。

雖然new的本質是去呼叫malloc,但是new 和 malloc還有一點很大的不同。那就是new 出來記憶體後,new會把物件給構造出來,而malloc只是分配記憶體。具體例子如下:

class myobj 

int val;

};myobj* obj = new myobj(4);

myobj* obj1 = (myobj*) malloc(sizeof(myobj));

new 的做法是在malloc分配出記憶體後,編譯器會直接呼叫類的建構函式在這片記憶體中構造出物件。

注意!只有編譯器能直接呼叫類的建構函式。而使用malloc的話,是無法直接在上面構造出物件的。

new和malloc的區別

1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...

malloc和new的區別

1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...

new 和 malloc 的區別

new 和 malloc 的區別 1.malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2.對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動...