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

C++ 內存管理細節:delete 後指針置 NULL 避免雙重釋放崩潰

     編輯:關於C++

核心概念

delete 釋放的是指針指向的內存,而非指針變量本身。指針變量本身(存儲地址的變量)仍存在,其值(地址)不變,成為「懸空指針」。

雙重釋放崩潰演示


#include 
using namespace std;

int main() {
    int* p = new int(10);
    delete p;        // 釋放內存
    delete p;        // 雙重釋放 → 運行時崩潰(Heap corruption)
    return 0;
}

編譯通過,運行崩潰。調試時無法在 delete 行設置斷點(編譯器優化/運行時機制)。

解決方案:釋放後置 NULL


#include 
using namespace std;

int main() {
    int* p = new int(10);
    delete p;
    p = NULL;        // 或 nullptr (C++11)
    delete p;        // 安全!delete NULL 無操作
    return 0;
}

C++ 標準保證:刪除空指針是安全的(無操作)。

最佳實踐

  1. 每次 delete 後立即 ptr = nullptr;
  2. 使用智能指針(unique_ptr, shared_ptr)自動管理,彈根杜絕此類問題
  3. 類析構函數中 delete 成員指針後置 nullptr
  4. 容器存儲裸指針時,清理循環中 delete 後置空

現代 C++ 建議

盡量不直接用 new/delete:

  • 局部對象優先棧分配
  • 動態分配用 std::make_unique/std::make_shared
  • 容器存值或智能指針,不存裸指針
  • 遵循 RAII:資源獲取即初始化,析構自動釋放

補充:delete vs delete[]

  • new T → delete ptr
  • new T[n] → delete[] ptr
  • 混用導致未定義行為(析構函數調用次數錯誤、堆元數據損壞)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved