2011-09-22 63 views
2

在C++中,總是使用new而不是malloc()。但是,在此question中,在避免平臺特定代碼的同時過載new運營商的最便攜方式是在其內部撥打malloc()進行實際分配。新增功能與新增功能(以malloc爲特色)

當重載時,調用構造函數並保持類型安全。另外,您可以監視和控制內存如何分配。

我的問題,當在這個容量中使用時,在C++中使用malloc()還有什麼缺點嗎?

+1

問題是什麼? –

+0

@David - 問題是,是否有任何理由我不應該在C++中使用malloc()。 –

+1

在你的例子中使用malloc是*實現'new' *。一旦你做完了(但首先考慮你是否真的需要這麼做,因爲這不是很常見),你只需使用'new'。 'malloc()'不會從中獲益。 –

回答

5

我能想到的最大缺點是你不能明確地調用deletedelete []上的一個指針,該指針使用malloc()分配而不會調用未定義的行爲。如果要使用高度不推薦的路徑並使用malloc()爲C++對象明確分配內存,則仍需調用placement new才能正確調用構造函數以初始化由malloc()分配的內存位置。如果沒有malloc()上的operator new包裝,您還需要測試以確保您不會得到NULL返回值,並創建一些代碼來處理您沒有拋出異常的情況。如果您只是試圖使用C庫函數(如memcpy())將C++對象複製到使用malloc()分配的堆內存中,那麼這也非常危險,並且可能會導致大量未定義的行爲。此外,因爲您使用placement new作爲對象構造,所以您將不得不顯式調用您的動態分配對象的構造函數,然後在指針上顯式調用free()。如果處理不當,這又會導致各種各樣的問題,特別是如果您想使用多態類型和虛擬基類時。

如果你打算只用malloc()free(),拇指的一個很好的規則,以避免不確定的行爲缺陷的工作是保持你分配的對象,並與malloc()free()到POD類型解除分配。這意味着非多態結構或類沒有用戶定義的構造函數,析構函數,複製構造函數,賦值運算符,私有/受保護的非靜態數據成員或基類以及所有非靜態數據成員struct/class本身就是POD類型。由於POD類型基本上是C風格的結構(但增加了定義非靜態方法和指針的功能),您可以安全地使用它們進行C風格的內存管理。

+1

我會重載'delete'以使用free()。我認爲在將控制權交給我的重載函數,我將釋放內存之前,關鍵字delete會調用析構函數。那是不正確的? –

+0

我相信只有在分配內存並傳遞給'placement new'的內存來自'malloc()'調用時纔會有效。否則,在未通過malloc()分配的內存位置上調用'free()'是未定義的行爲。有人請糾正我,如果我錯了... – Jason

+1

這個答案似乎與'malloc'超載'operator new'時使用很少。當重載'operator new'時,你的工作就是分配一個所需大小的內存塊並返回一個'void *'給它。 'malloc'對此很好。 - 如果使用'new'關鍵字(而不是顯式調用重載的'operator new'函數),則會自動完成對象創建的魔法。 – visitor

3

你自己說過...直接在C++代碼中使用malloc/free的缺點是構造函數和析構函數不會運行;使用new/delete確保運行構造函數和析構函數。但是,通過new/delete操作符間接使用malloc沒有任何問題。

+0

謝謝!我明白操作員之外的缺點,只是想確保'從不使用malloc/free在C++'公理是這裏有一個例外 –

7

如果你想覆蓋newdelete那麼你幾乎必須使用mallocfree。這就是要做的。不要害怕。

依然存在使用malloc()之外的缺陷new()的實施。

+0

好吧,那就是我想知道的。我擔心我可能會做一些錯誤,否則,根據我所讀到的有關malloc和C++ –