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無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動...