c++ dynamic - new / delete和malloc / free有什麼區別?





memory array (13)


  • new是一個運算符,而malloc()是一個函數。
  • new返回確切的數據類型,而malloc()返回void *(void類型的指針)。
  • malloc(),內存沒有初始化,默認值是垃圾,而在新的情況下,內存使用默認值進行初始化,就像int中的“零(0)”一樣。
  • delete和free()都可以用於'NULL'指針。

new / deletemalloc / free什麼區別?

相關(重複?): 我在哪些情況下使用malloc vs new?




new / delete是C ++, malloc / free來自好老C.

在C ++中, new調用對象構造函數, delete調用析構函數。

mallocfree ,來自OO之前的黑暗時代,只分配和釋放內存,而不執行對象的任何代碼。




newdelete是C ++ 基元 ,它聲明一個新的類的實例或刪除它(因此調用實例的類的析構函數)。

mallocfree是C 函數 ,它們分配和釋放內存塊(大小)。

兩者都使用堆來進行分配。 mallocfree是更“低級”的,因為它們只保留了一塊可能與指針相關的內存空間。 在內存周圍不會創建任何結構(除非您將C數組視為結構)。




在C ++中, new / delete調用Constructor / Destructor。

malloc / free只需從堆中分配內存。 new / delete分配內存。




1.new syntex比malloc()簡單

2.new/delete是一個運算符,其中malloc()/ free()是一個函數。

3.新/刪除執行比malloc()/ free()更快,因為編譯器直接粘貼了新的彙編代碼。

4.我們可以在運營商覆蓋的幫助下更改程序中新增/刪除的含義。




新/刪除

  • 分配/釋放內存
    1. 從“Free Store”分配的內存
    2. 返回一個完全類型的指針。
    3. 新(標準版)從不返回NULL(將失敗)
    4. 用Type-ID調用(編譯器計算大小)
    5. 有明確的版本來處理數組。
    6. 重新分配(以獲得更多空間)不直觀地處理(因為複制構造函數)。
    7. 他們是否調用malloc / free是實現定義的。
    8. 可以添加一個新的內存分配器來處理低內存(set_new_handler)
    9. 運算符new / delete可以合法地覆蓋
    10. 用於初始化/銷毀對象的構造函數/析構函數

的malloc /免費

  • 分配/釋放內存
    1. 從'堆'分配的內存
    2. 返回一個void *
    3. 失敗時返回NULL
    4. 必須以字節指定所需的大小。
    5. 分配數組需要手動計算空間。
    6. 重新分配更大塊的內存很簡單(不需要復制構造函數)
    7. 他們不會調用新的/刪除
    8. 沒有辦法將用戶代碼拼接到分配序列中以幫助減少內存。
    9. malloc / free 不能被合法覆蓋

表格比較的功能:

 Feature                  | new/delete                     | malloc/free                   
--------------------------+--------------------------------+-------------------------------
 Memory allocated from    | 'Free Store'                   | 'Heap'                        
 Returns                  | Fully typed pointer            | void*                         
 On failure               | Throws (never returns NULL)    | Returns NULL                  
 Required size            | Calculated by compiler         | Must be specified in bytes    
 Handling arrays          | Has an explicit version        | Requires manual calculations  
 Reallocating             | Not handled intuitively        | Simple (no copy constructor)  
 Call of reverse          | Implementation defined         | No                            
 Low memory cases         | Can add a new memory allocator | Not handled by user code      
 Overridable              | Yes                            | No                            
 Use of (con-)/destructor | Yes                            | No                            

技術上來說,由new分配的內存來自'Free Store',而由malloc分配的內存來自'Heap'。 這兩個領域是否相同是一個實現細節,這是malloc和new不能混合的另一個原因。




  • 要使用malloc() ,我們需要在程序中包含 <stdlib.h><alloc.h> ,這對於new程序不是必需的。
  • newdelete可以重載,但malloc不能。
  • 使用new的位置,我們可以傳遞我們想要分配內存的地址,但在malloc情況下這是不可能的。



new和malloc之間的主要區別在於new調用對象的構造函數,相應的delete調用調用對象的析構函數。

還有其他區別:

  • new是類型安全的, malloc返回void*類型的對象

  • new在錯誤時拋出異常, malloc返回NULL並設置errno

  • new是一個運算符,可以重載, malloc是一個函數,不能重載

  • new[]分配數組,比malloc更直觀,更安全

  • malloc派生的分配可以通過realloc調整大小, new派生的分配不能調整大小

  • malloc可以分配一個N字節的內存塊, new必須被要求分配一個char類型的數組

看看這些差異,一個總結是malloc是C-esque,新是C ++ - esque。 使用適合你的代碼庫的那個。

雖然使用不同的內存分配算法來實現new和malloc是合法的,但在大多數係統中,新內部使用malloc在內部實現,不產生系統級差異。




有幾件事是mallocnew做的:

  1. new通過調用該對象的構造函數來構造該對象
  2. new不需要分配內存的類型轉換。
  3. 它不需要分配大量內存,而是需要構建大量對象。

所以,如果你使用malloc ,那麼你需要明確地做以上的事情,這並不總是實際的。 另外, new可以被重載,但是malloc不能。

總之,如果您使用C ++,盡可能使用new




唯一的相似之處是malloc / new都返回一個指向堆中某個內存的指針,並且它們都保證一旦這樣的內存塊被返回,它就不會被再次返回,除非你先釋放/刪除它。 也就是說,他們都“分配”內存。

但是, new / delete可以通過構造函數,析構函數和運算符重載來執行任意其他工作。 malloc / free只能分配和釋放內存。

實際上, new有足夠的可定制性,它不一定會從堆中返回內存,甚至根本不需要分配內存。 然而,默認的new功能。




new和delete是c ++中的運算符; 這也可能會過載。 malloc和free是c中的函數;

malloc在失敗時返回空ptr,而新拋出異常。

malloc返回的地址需要通過類型再次輸出,因為它返回(void *)malloc(size)New返回類型化指針。




new呼叫對象的Ctor, delete呼叫Dtor。

mallocfree只是分配和釋放原始內存。








c++ memory-management