delete 釋放的是指針指向的內存,而非指針變量本身。指針變量本身(存儲地址的變量)仍存在,其值(地址)不變,成為「懸空指針」。
#include
using namespace std;
int main() {
int* p = new int(10);
delete p; // 釋放內存
delete p; // 雙重釋放 → 運行時崩潰(Heap corruption)
return 0;
}
編譯通過,運行崩潰。調試時無法在 delete 行設置斷點(編譯器優化/運行時機制)。
#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++ 標準保證:刪除空指針是安全的(無操作)。
delete 後立即 ptr = nullptr;unique_ptr, shared_ptr)自動管理,彈根杜絕此類問題delete 成員指針後置 nullptrdelete 後置空盡量不直接用 new/delete:
std::make_unique/std::make_sharednew T → delete ptrnew T[n] → delete[] ptr