野指標:指向不可預知記憶體位址的指標。未初始化、已釋放未置空、超出作用域的指標皆屬此類。解引用野指標會導致未定義行為:資料損毀、程式崩潰、甚至系統死機。
int* p; // 野指標
*p = 10; // 崩潰風險
free/delete 僅釋放記憶體,指標變數本身仍保留舊位址。
int* p = new int(5);
delete p; // p 成為野指標
*p = 20; // 未定義行為
int* foo() { int x=1; return &x; } // x 生命週期結束,回傳野指標
void func() {
char* str = new char[100];
delete[] str;
strcpy(str, "Dangerous!!"); // str 為野指標,執行期崩潰
}
char *p, *p1 = "hello";
while ((*(p++) = *(p1++)) != 0); // p 未初始化 → 野指標 → 崩潰
char *p = NULL; // 同樣錯誤,NULL 不可寫入
char *p = ""; // 指向常數區,不可修改 → 崩潰
char c[] = ""; // 陣列太小 → 越界覆蓋變數 i → 死迴圈
正確做法:char *p = new char[strlen(p1)+1]; 分配足夠空間。
int* p = nullptr;(C++11 起用 nullptr)。p = new int[n]; assert(p != nullptr);new → delete,new[] → delete[]。delete p; p = nullptr;。#include
std::unique_ptr p = std::make_unique(42); // 自動釋放,無野指標
std::shared_ptr sp = std::make_shared(10); // 共享擁有權
unique_ptr:獨占擁有權,編譯期保證單一擁有者。shared_ptr:參考計數,自動管理生命週期。weak_ptr:打破循環引用,不增加計數。野指標是 C/C++ 最大的記憶體安全隱患。遵循「初始化、配對、置空、智慧指標」四原則,配合現代 C++ RAII 機制,可從根源消除野指標風險。