| 形式 | 功能 | 是否分配內存 | 是否調用構造函數 | 典型用途 |
|---|---|---|---|---|
new Operator | 「分配 + 構造」一站式 | 是 | 是 | 日常 99% 場景 |
operator new | 僅分配原始內存 | 是 | 否 | 自定義內存池、延遲構造 |
placement new | 在已有內存上構造對象 | 否 | 是(調用拷貝/移動構造) | 對象池、共享內存、嵌入式定點構造 |
#ifndef _EMP_H_
#define _EMP_H_
class Emp {
public:
Emp();
Emp(const Emp& other); // 拷貝構造
~Emp();
};
#endif
#include "Emp.h"
#include <iostream>
using namespace std;
Emp::Emp() { cout << "Emp..." << endl; }
Emp::Emp(const Emp& other) { cout << "Copy Emp..." << endl; }
Emp::~Emp() { cout << "~Emp..." << endl; }
#include "Emp.h"
#include <iostream>
using namespace std;
int main() {
// 1. new operator:分配 + 默認構造
Emp* e1 = new Emp; // 輸出: Emp...
// 2. operator new:僅分配 sizeof(Emp) 字節原始內存
Emp* e2 = (Emp*)operator new(sizeof(Emp)); // 無輸出
// 3. placement new:在 e2 指向的內存上調用拷貝構造函數
new ((void*)e2) Emp(*e1); // 輸出: Copy Emp...
// 4. 顯式調用析構函數(placement new 必須手動析構)
e2->~Emp(); // 輸出: ~Emp...
// 5. 僅釋放內存,不調用析構(配對 operator new)
operator delete(e2); // 無輸出
// 6. 標準 delete:析構 + 釋放(配對 new operator)
delete e1; // 輸出: ~Emp...
return 0;
}
Emp... ← e1 默認構造 Copy Emp... ← e2 placement new 拷貝構造 ~Emp... ← e2 顯式析構 ~Emp... ← e1 delete 析構
new operator 配 delete;operator new 配 operator delete;placement new 配 顯式析構函數調用 + operator delete(若內存由 operator new 分配)。new (ptr) Emp(arg1, arg2)。placement new 是唯一標準方式。void* operator new(size_t size) {
// 從預分配內存池切塊,失敗拋 bad_alloc
}
void operator delete(void* ptr) noexcept {
// 歸還內存池
}
重載後,所有 new Type 自動使用內存池,delete ptr 自動歸還,**業務代碼零修改**即可實現高性能定長分配。
理解 new 三部曲,本質是理解 內存分配、對象構造、對象析構、內存釋放 四個階段的組合與解耦。日常用 new/delete,性能敏感處用 operator new/delete 搭建池,特殊地址構造用 placement new,三者各司其職,構建 C++ 內存管理的完整拼圖。