delete ptr; 執行兩步:
ptr->~Type()。operator delete(ptr)(全局或類特定的釋放函數)。若僅需原始內存,應使用 operator new 分配、operator delete 釋放,不調用構造/析構:
void* buf = operator new(50 * sizeof(char)); // 使用 buf... operator delete(buf);
delete[] arr; 對數組每個元素逆序調用析構函數,然後調用 operator delete[](ptr) 釋放整塊內存。
錯誤示範:delete arr;(漏掉 [])會導致未定義行為(通常只析構第一個元素)。
Placement new 在預分配內存上構造對象:
char buffer[sizeof(MyClass)]; MyClass* obj = new(buffer) MyClass(); // 不分配內存,只構造
銷毀時不能用 delete obj;(會嘗試釋放 buffer 內存)。必須顯式調用析構函數:
obj->~MyClass(); // 僅析構,不釋放內存
void* operator new(size_t), void operator delete(void*)。operator new[](size_t), operator delete[](void*)。void* operator new(size_t, void*)(標準庫提供,不釋放內存)。unique_ptr/shared_ptr 自動管理生命週期,避免手動 delete 錯誤。理解 delete 的完整語義(析構+釋放)及其與 operator delete 的區別,對編寫正確、高效的 C++ 內存管理代碼至關重要。現代 C++ 建議儘量使用 RAII 容器與智能指針替代手動內存管理。