從五個方面來討論這個問題
1. 記憶體的開闢位置與開闢記憶體時的功能
malloc與new的記憶體開闢區域都是 堆區,但是malloc只負責開闢記憶體,之後的初始化需要使用者來進行,而new則可以在開闢記憶體的同時進行初始化操作new int。
如new int(10);表示在堆上開闢了乙個4位元組的int整形記憶體,初始值是10,再如new int10;表示在堆上開闢了乙個包含10個整形元素的陣列,初始值都為0
不僅如此,當使用類型別初始化的時候:
test *p = new test();
這個語句不僅會在堆上開闢test型別大小的一塊記憶體,還會呼叫test類的預設建構函式構造乙個物件出來,這些都是malloc辦不到的!
2. 返回值的型別
malloc的返回值型別是void *,所以使用者在使用時需要對其型別進行強轉,轉化為所需要的型別。
new在開闢記憶體的時候指定返回值的型別,因此,返回的是指定型別的位址。
3.記憶體開闢失敗
當記憶體開闢失敗
malloc返回null;
new則是會丟擲乙個bad_alloc型別的異常,需要捕捉這個異常才能知道記憶體是否開闢成功。
4.記憶體的釋放
malloc ——》 free
new ——》delete new ——》 delete
delete比free多一項功能就是在釋放記憶體之前,還可以析構指標指向的物件,new和delete配對使用,new和delete配對使用,盡量不要交叉使用,以免產生不可預期的問題。
5.種類
malloc只有這麼一種開闢記憶體的方式
而new有四種1.普通new(開闢記憶體失敗,丟擲bad_alloc型別的異常)
2.nothrow型別的new
3.const new
4.定位new
**注意:在c++盡量不使用memcpy與realloc函式,這兩個函式只是進行記憶體的值拷貝,也就是我們說的物件的淺拷貝,當物件具有外部資源時容易出現淺拷貝的問題。
new與malloc的區別
1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...
new與malloc的區別
malloc 與free 是c c 語言的標準庫函式,new delete 是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於 malloc...
Malloc與new 的區別
malloc與new 的區別 1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行...