總體來說,除非是為了與 C 代碼兼容、優化底層內存管理或其他特殊原因,在現代 C++ 中不再推薦使用 malloc。?

new 與智能指針提供了類型安全、自動管理內存等優點,能夠更好地滿足大多數場景的需求。
1
malloc?和?new?的區別
malloc 是 C 語言的內存分配函數,分配的內存是未初始化的,并返回 void*?類型的指針。
要想將 malloc 的返回值賦給特定類型的指針,需要進行顯式類型轉換,這就缺乏類型安全性。
而 C++ 的 new 操作符會自動調用構造函數,并返回指定類型的指針,避免了類型轉換問題,增加了類型安全性。
new 不僅分配內存,還會調用類的構造函數來初始化對象。而 malloc 僅分配內存,不做初始化。
這意味著使用 malloc 時,我們無法直接管理對象的生命周期,必須手動調用構造函數和析構函數(這幾乎不常見且容易出錯)。
2
智能指針和現代 C++ 內存管理
C++11 引入了智能指針,如 std::unique_ptr 和 std::shared_ptr,它們通過 RAII(Resource Acquisition Is Initialization)機制幫助自動管理內存。
這讓開發者幾乎不需要直接調用 new 或 delete,大幅降低了內存泄漏的風險。更不用說 malloc 和 free 了。
例如:
std::unique_ptrptr = std::make_unique(10); // 自動管理內存使用智能指針,內存會在指針超出作用域時自動釋放,無需手動調用 free。
3
使用?malloc?的場景
盡管現代 C++ 提供了更好的內存管理工具,但在少數特定場景下,malloc 仍然可能有其用武之地。
如果你需要與大量 C 代碼或使用 C 庫的項目協作(如某些底層嵌入式系統開發),使用 malloc 會更容易實現與 C 代碼的無縫交互。
在某些性能要求極高的系統中,為了精細控制內存布局和管理,開發者可能會實現自定義的內存分配器。
自定義分配器的內部實現可能基于 malloc 這種低級分配函數,以便更靈活地優化內存操作。
不需要構造函數的分配:對于不需要初始化的原始數據塊或 POD(Plain Old Data)類型數據,malloc 有時可能更加直接,比如用于分配一個不需要構造和析構的字節緩沖區。
4
實際代碼示例
C++ 的方式
struct MyClass {MyClass() { std::cout << "Constructed\n"; }~MyClass() { std::cout << "Destructed\n"; }};int main() {auto ptr = std::make_unique(); // 自動調用構造/析構}
使用?malloc?的方式(不推薦,除非必須兼容 C)
struct MyClass {MyClass() { std::cout << "Constructed\n"; }~MyClass() { std::cout << "Destructed\n"; }};int main() {MyClass* ptr = (MyClass*)malloc(sizeof(MyClass));new(ptr) MyClass; // 手動調用構造函數ptr->~MyClass(); // 手動調用析構函數free(ptr);}
在第二種方式中,手動管理構造和析構顯得繁瑣且不直觀,容易引入內存泄漏或未定義行為。
