2013-05-06 88 views
4

呈C++,香草薩特在項35寫作爲指導:爲什麼我更喜歡在堆上使用免費商店?

使用自由存儲區體型(新的/刪除)。避免使用堆 (malloc/free)。

我爲什麼要?

如果實施選擇通過使用malloc來實現new,則可能會產生開銷,因此就性能而言,看起來像是一個糟糕的建議。

+0

http://stackoverflow.com/questions/1350819/c-free-store-vs-heap - 似乎回答你的問題 – DarkWanderer 2013-05-06 18:23:45

+6

'malloc/free'不知道構造函數和析構函數是什麼。這足以說明一直使用'new/delete'的原因。 – syam 2013-05-06 18:23:48

+0

@syam:謝謝,但我認爲Exceptional C++的讀者已經對'malloc'和'new'之間的區別有所瞭解。我希望這本書的作者試圖提出另一個觀點。 – qdii 2013-05-06 18:26:12

回答

11

newdelete關鍵字在C++通常在mallocfree方面實現的,但它們被設計用來做不同的事情。

在C++中,如果你說

new T(/* args */) 

C++將執行以下操作:

  • 嘗試分配足夠的內存來保存T類型的對象。
  • 失敗時,嘗試使用新處理程序釋放空間,如果沒有可用內存,則最終拋出std::bad_alloc對象。
  • 嘗試在該內存塊中構造一個類型爲T的對象。
  • 如果類型爲T的對象的構造引發異常,則會自動釋放內存。

如果只是用malloc,你必須手動完成所有這些步驟,這將是非常,非常。它可能是這個樣子:

T* memory; 
while (true) { 
    memory = static_cast<T*>(malloc(sizeof(T))); 
    if (memory == nullptr) std::get_new_handler()(); 
} 

try { 
    new (memory) T(/* args */); 
} catch (...) { 
    free(memory); 
    throw; 
} 

這裏有,我已經掩蓋了(就像調用operator new,而不是malloc,或處理零大小的請求等)其他一些細微之處,但我希望這有助於解釋如何newmalloc是不同的。

那麼,爲什麼你應該使用new而不是malloc?好吧,有幾個原因:

  • 它更安全。 With malloc With you malloc您可以忘記檢查空指針的返回類型,或者您可能請求錯誤的存儲空間量,或者您可能忘記調用對象的構造函數,或者如果構造函數拋出時可能忘記釋放內存例外等

  • 它更安全。malloc返回一個void*,它只是一個指向內存塊的指針。使用malloc,您必須將指針轉換爲正確的類型,這會在稍後引入錯誤。

  • 它允許自定義。某些類型重載operator new以不尋常的方式請求內存,例如來自池分配器或某些可能更快的內存塊,或者使用自定義分配器來優化使用模式。鑑於此,只需定義operator newoperator delete,您就可以自動定製動態分配內存類型爲T的對象的所有時間。如果使用malloc,則必須在整個程序中追查所有內存分配站點。

也就是說,malloc有一些優點。如果你確實知道你正在分配的對象是平凡的對象(如原始數據或只保存數據的結構),那麼使用malloc可能會稍微快一點。 malloc也可以讓你使用realloc,其中free沒有。但說實話,在這種情況下使用std::vectorstd::array可能會更好,因爲它們更安全,更易於調試,並且具有良好的編譯器支持可能會被積極優化。

希望這會有所幫助!

相關問題