呈C++,香草薩特在項35寫作爲指導:爲什麼我更喜歡在堆上使用免費商店?
使用自由存儲區體型(新的/刪除)。避免使用堆 (malloc/free)。
我爲什麼要?
如果實施選擇通過使用malloc
來實現new
,則可能會產生開銷,因此就性能而言,看起來像是一個糟糕的建議。
呈C++,香草薩特在項35寫作爲指導:爲什麼我更喜歡在堆上使用免費商店?
使用自由存儲區體型(新的/刪除)。避免使用堆 (malloc/free)。
我爲什麼要?
如果實施選擇通過使用malloc
來實現new
,則可能會產生開銷,因此就性能而言,看起來像是一個糟糕的建議。
的new
和delete
關鍵字在C++通常在malloc
和free
方面實現的,但它們被設計用來做不同的事情。
在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
,或處理零大小的請求等)其他一些細微之處,但我希望這有助於解釋如何new
和malloc
是不同的。
那麼,爲什麼你應該使用new
而不是malloc
?好吧,有幾個原因:
它更安全。 With malloc
With you malloc
您可以忘記檢查空指針的返回類型,或者您可能請求錯誤的存儲空間量,或者您可能忘記調用對象的構造函數,或者如果構造函數拋出時可能忘記釋放內存例外等
它更安全。malloc
返回一個void*
,它只是一個指向內存塊的指針。使用malloc
,您必須將指針轉換爲正確的類型,這會在稍後引入錯誤。
它允許自定義。某些類型重載operator new
以不尋常的方式請求內存,例如來自池分配器或某些可能更快的內存塊,或者使用自定義分配器來優化使用模式。鑑於此,只需定義operator new
和operator delete
,您就可以自動定製動態分配內存類型爲T
的對象的所有時間。如果使用malloc
,則必須在整個程序中追查所有內存分配站點。
也就是說,malloc
有一些優點。如果你確實知道你正在分配的對象是平凡的對象(如原始數據或只保存數據的結構),那麼使用malloc
可能會稍微快一點。 malloc
也可以讓你使用realloc
,其中free
沒有。但說實話,在這種情況下使用std::vector
或std::array
可能會更好,因爲它們更安全,更易於調試,並且具有良好的編譯器支持可能會被積極優化。
希望這會有所幫助!
http://stackoverflow.com/questions/1350819/c-free-store-vs-heap - 似乎回答你的問題 – DarkWanderer 2013-05-06 18:23:45
'malloc/free'不知道構造函數和析構函數是什麼。這足以說明一直使用'new/delete'的原因。 – syam 2013-05-06 18:23:48
@syam:謝謝,但我認爲Exceptional C++的讀者已經對'malloc'和'new'之間的區別有所瞭解。我希望這本書的作者試圖提出另一個觀點。 – qdii 2013-05-06 18:26:12