free(p) 或 delete p 僅釋放記憶體,**不會自動將指標設為 NULL**。指標仍保有原位址值,變成野指標。
野指標 ≠ NULL 指標,是指向「垃圾」記憶體的指標。if 可判斷 NULL,但對野指標無效,極度危險。
char* p = NULL; 或指向合法記憶體。p = NULL;,否則誤以為仍合法。
class A {
public:
void Func() { cout << "Func of A" << endl; }
};
void Test() {
A* p;
{
A a;
p = &a; // a 生命週期僅在此區塊
}
p->Func(); // p 成為野指標,a 已銷毀
}
執行 p->Func() 時 a 已消失,p 指向已釋放的堆疊記憶體。某些編譯器可能偶然不報錯,但屬未定義行為。
malloc/free:C/C++ 標準庫**函式**。new/delete:C++ **運算子**。對**非內建型別物件**,malloc/free 無法滿足需求:
malloc/free 是庫函式,不在編譯器控制權下,無法強制執行建構/解構。因此 C++ 需要 new(配置+初始化)與 delete(清理+釋放)。
class Obj {
public:
Obj() { cout << "Initialization" << endl; }
~Obj() { cout << "Destroy" << endl; }
void Initialize() { cout << "Initialization" << endl; }
void Destroy() { cout << "Destroy" << endl; }
};
void UseMallocFree() {
Obj* a = (Obj*)malloc(sizeof(Obj)); // 僅配置記憶體
a->Initialize(); // 手動初始化
// ...
a->Destroy(); // 手動清理
free(a); // 釋放記憶體
}
void UseNewDelete() {
Obj* a = new Obj; // 配置 + 自動建構
// ...
delete a; // 自動解構 + 釋放
}
UseNewDelete 簡潔得多。動態物件必須用 new/delete;內建型別兩者等價。
C++ 常呼叫 C 函式,C 只能用 malloc/free 管理動態記憶體。兩套機制須共存。
new 配 delete,malloc 配 free。free 釋放 new 物件 → 無法執行解構函式 → 錯誤。delete 釋放 malloc 記憶體 → 理論不錯但可讀性極差。