野指針 ≠ nullptr**。指向「垃圾記憶體」,if(p) 無法偵測,極難診斷。
char* p = nullptr; // ✅ 好習慣
char* str = (char*)malloc(100); // ✅ 指向合法記憶體
void Test() {
A* p;
{ A a; p = &a; } // a 死於此
p->Func(); // ❌ 野指針呼叫 (作者實測未崩潰,屬巧合/編譯器差異,極度危險)
}
| 維度 | malloc/free | new/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**;內建型別兩者等價。
C++ 常呼叫 C 函數,**C 代碼只能用 malloc/free**。跨語言邊界需各自管理記憶體。
new 配 delete,new[] 配 delete[]。malloc 配 free。free(new Obj) 漏解構;delete malloc(...) 讀碼差且理論風險。