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

C/C++ 野指標成因、危害與防範完整指南

     編輯:關於C語言

什麼是野指標?

野指標:指向不可預知記憶體位址的指標。未初始化、已釋放未置空、超出作用域的指標皆屬此類。解引用野指標會導致未定義行為:資料損毀、程式崩潰、甚至系統死機。

三大成因

  1. 未初始化:區域指標變數預設值為隨機位址。
    int* p; // 野指標
    *p = 10; // 崩潰風險
  2. 釋放後未置空:free/delete 僅釋放記憶體,指標變數本身仍保留舊位址。
    int* p = new int(5);
    delete p; // p 成為野指標
    *p = 20;  // 未定義行為
  3. 超出作用域:回傳區域變數位址、使用已銷毀物件的指標。
    int* foo() { int x=1; return &x; } // x 生命週期結束,回傳野指標

經典案例分析

案例 1:釋放後繼續使用

void func() {
    char* str = new char[100];
    delete[] str;
    strcpy(str, "Dangerous!!"); // str 為野指標,執行期崩潰
}

案例 2:初始化陷阱

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]; 分配足夠空間。

標準防範六步驟

  1. 宣告即初始化:int* p = nullptr;(C++11 起用 nullptr)。
  2. 分配後斷言:p = new int[n]; assert(p != nullptr);
  3. 配對刪除:new → delete,new[] → delete[]。
  4. 刪除即置空:delete p; p = nullptr;。
  5. 誰分配誰釋放:避免跨函數/模組傳遞擁有權,必要時用智慧指標。
  6. 慎回傳區域位址:若必須回傳,需註記生命週期或改用靜態/動態儲存。

現代 C++ 最佳實務:智慧指標

#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 機制,可從根源消除野指標風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved