首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ delete 操作符深度解析:單一對象、數組與放置 new

     編輯:C++ 入門

一、單一對象內存釋放

delete ptr; 執行兩步:

  1. 調用對象析構函數:ptr->~Type()。
  2. 釋放內存: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 的特殊處理

Placement new 在預分配內存上構造對象:

char buffer[sizeof(MyClass)];
MyClass* obj = new(buffer) MyClass(); // 不分配內存,只構造

銷毀時不能用 delete obj;(會嘗試釋放 buffer 內存)。必須顯式調用析構函數:

obj->~MyClass(); // 僅析構,不釋放內存

四、operator new/delete 重載

  • 全局重載:void* operator new(size_t), void operator delete(void*)。
  • 類成員重載:靜態成員函數,優先用於該類對象。
  • 數組版:operator new[](size_t), operator delete[](void*)。
  • Placement 版:void* operator new(size_t, void*)(標準庫提供,不釋放內存)。

五、最佳實踐總結

  1. 配對使用:new/delete,new[]/delete[],placement new/顯式析構。
  2. 避免混用:malloc/free 不調用構造/析構,不能與 new/delete 混用同一塊內存。
  3. 智能指針:現代 C++ 首選 unique_ptr/shared_ptr 自動管理生命週期,避免手動 delete 錯誤。
  4. 虛析構:基類指針刪除派生對象時,基類析構函數必須為 virtual。

總結

理解 delete 的完整語義(析構+釋放)及其與 operator delete 的區別,對編寫正確、高效的 C++ 內存管理代碼至關重要。現代 C++ 建議儘量使用 RAII 容器與智能指針替代手動內存管理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved