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

C++ 記憶體陷阱:馴服野指標與淺拷貝的危機

     編輯:關於C++

什麼是野指標?

想像一位母親有兩個孩子(兩個指標),分別在廚房和臥室(不同的程式碼區塊,生命週期不同)。母親讓廚房的孩子拿一塊蛋糕(指標指向的物件)給臥室的孩子,這樣臥室的孩子才肯寫作業。然而廚房的孩子頑皮,出門前把蛋糕自己吃光了。臥室的孩子等不到蛋糕,拒絕寫作業,母親卻以為任務完成,隔天被老師叫去訓話。這個拿不到蛋糕的臥室孩子,就是所謂的「野指標」——指向已釋放或無效記憶體的指標。

這只是最基礎的野指標形成過程。更常見的是程式設計師不慎使用已 free 或 delete 過的指標。經驗不足的開發者容易犯此錯,資深工程師會透過配對程式設計、引用計數或智慧型指標來避免。

C++ 的額外挑戰:類別與動態記憶體

C++ 程式設計師無可避免地編寫大量類別。當類別的資料成員在建構函式中用 new 動態配置記憶體時,若未正確處理拷貝語意,麻煩就來了。

預設情況下,C++ 採用「位元級拷貝」(bitwise copy)進行物件初始化、傳值呼叫函式、回傳物件或指派。若類別內含指標指向動態記憶體,兩個物件將共用同一塊記憶體。一旦其中一個物件被銷毀,其解構函式釋放記憶體,另一個物件內的指標便成為野指標,宛如共用器官的連體嬰兒,一方受損,另一方也跟著倒楣。

三種觸發淺拷貝的情境

  1. 物件初始化另一物件(宣告時)。
  2. 物件按值傳遞給函式。
  3. 函式回傳物件時產生暫時物件。

解決之道:拷貝建構函式與指派運算子重載

針對初始化問題,必須實作拷貝建構函式(Copy Constructor):

ClassName(const ClassName& other) {
    // 深度拷貝:重新配置記憶體並複製內容
}

針對指派操作,必須重載指派運算子(Assignment Operator),並處理自我指派、釋放舊記憶體、深度拷貝、回傳 *this 以支援鏈式指派。

掌握「三大法則」(建構函式、拷貝建構函式、指派運算子、解構函式)是馴服 C++ 野指標的關鍵。別讓你的物件淪為可憐的連體嬰兒!

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