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

高品質 C++/C 程式設計指南 第 7 章 (四):野指針成因、new/delete vs malloc/free 深度對決

     編輯:關於C++

7.7 野指針:比 nullptr 更隱蔽的殺手

野指針 ≠ nullptr**。指向「垃圾記憶體」,if(p) 無法偵測,極難診斷。

三大成因

  1. 未初始化:剛宣告指標值隨機。
    char* p = nullptr;           // ✅ 好習慣
    char* str = (char*)malloc(100); // ✅ 指向合法記憶體
  2. free/delete 後未置 nullptr:指標仍指向已釋放區域,誤以為有效。鐵律:釋放即置空。
  3. 超出生命週期:指向區域物件的指標逃逸。
    void Test() {
        A* p;
        { A a; p = &a; } // a 死於此
        p->Func(); // ❌ 野指針呼叫 (作者實測未崩潰,屬巧合/編譯器差異,極度危險)
    }

7.8 為何有 malloc/free 還要 new/delete?

維度malloc/freenew/delete
本質標準庫函數C++ 運算子 (編譯器管控)
非內建型別❌ 無法自動建構/解構✅ 分配+建構 / 解構+釋放 一體化
內建型別等價等價

實戰對比

class Obj {
public:
    Obj() { cout << "Init"; }
    ~Obj() { cout << "Destroy"; }
    void Initialize() { cout << "Init"; }
    void Destroy() { cout << "Destroy"; }
};

void UseMallocFree() {
    Obj* a = (Obj*)malloc(sizeof(Obj)); // 僅分配
    a->Initialize();                    // 手動初始化
    a->Destroy();                       // 手動清理
    free(a);
}

void UseNewDelete() {
    Obj* a = new Obj; // 分配+初始化
    delete a;         // 清理+釋放
}

結論:動態物件**必須用 new/delete**;內建型別兩者等價。

為何不淘汰 malloc/free?

C++ 常呼叫 C 函數,**C 代碼只能用 malloc/free**。跨語言邊界需各自管理記憶體。

配對鐵律

  • new 配 delete,new[] 配 delete[]。
  • malloc 配 free。
  • **交叉使用 = 未定義行為**:free(new Obj) 漏解構;delete malloc(...) 讀碼差且理論風險。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved