C++ 內建的 new、new[]、delete、delete[] 對大多數場景已足夠。但在特定需求下——如實現記憶體池、追蹤記憶體洩漏、自定義分配策略(對齊、分區、共享記憶體)等——重載這些運算符成為必要手段。
重載形式可為類成員函數或全域函數,兩者語法略有不同但核心簽名一致。
new / new[] 運算符void* ClassName::operator new(size_t size) {
// 自定義分配邏輯
return allocated_memory;
}
void* operator new(size_t size) {
// 全域自定義分配邏輯
return allocated_memory;
}
關鍵規則:
void*size_t,表示請求分配的位元組數(new[] 時為總大小)size_t 通常定義為 typedef unsigned int size_t;(在 <cstdio> 中)delete / delete[] 運算符void ClassName::operator delete(void* ptr) {
// 自定義釋放邏輯
}
void operator delete(void* ptr) {
// 全域自定義釋放邏輯
}
關鍵規則:
voidvoid* 參數,指向待釋放的記憶體new 通常需重載對應的 deleteclass C {
public:
void* operator new(size_t size) {
cout << "Custom new called, size: " << size << endl;
return malloc(size); // 或其他分配策略
}
void operator delete(void* ptr) {
cout << "Custom delete called" << endl;
free(ptr);
}
};
int main() {
C* c = new C; // 調用 C::operator new
// ...
delete c; // 調用 C::operator delete
return 0;
}
若類未定義重載,編譯器自動調用內建運算符。
new 從池中切分,delete 歸還池中,減少系統調用開銷std::bad_alloc,符合標準行為new/delete、new[]/delete[] 必須成對重載,避免未定義行為重載 new/delete 賦予類完全的記憶體管理自主權,是高效能、嵌入式、遊戲引擎等領域的核心技能。但濫用會增加複雜度,僅在確有必要時使用,且務必嚴格遵循配對與異常安全原則。