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

C/C++ 記憶體管理實戰(一):三種配置方式、常見錯誤與對策、指標與陣列本質差異

     編輯:VC 教學

第 7 章 記憶體管理:歡迎進入雷區

「640K ought to be enough for everybody」—— Bill Gates, 1981

程式設計師常在提心吊膽中撰寫記憶體管理程式碼。不想踩雷,唯有**發現所有潛在地雷並排除**,躲是躲不掉的。本章深度遠超一般教科書,請細讀,做到真正通曉記憶體管理。

7.1 記憶體配置三種方式

  1. 靜態儲存區:編譯期配置,程式整個執行期間存在。如全域變數、static 變數。
  2. 堆疊:函式執行時區域變數在堆疊建立,函式結束自動釋放。CPU 指令集內建,效率極高,但容量有限。
  3. 堆積:執行期用 malloc/new 申請任意大小,程式設計師負責用 free/delete 釋放。生存期由我們決定,彈性最大,**問題也最多**。

7.2 常見記憶體錯誤與對策

記憶體錯誤極麻煩:編譯器無法自動發現,通常執行期才暴露;多無明顯症狀,時隱時現,難以重現除錯。

錯誤類型成因對策
配置失敗卻使用新手未意識到配置可能失敗使用前檢查指標是否 NULL;參數用 assert(p!=NULL);malloc/new 用 if(p==NULL)
配置成功但未初始化就引用無初始化觀念;誤以為預設為零無論何種方式建立陣列,**別忘了賦初值**,即便是零值也不可省略
操作超出記憶體邊界陣列下標「多1」或「少1」;for 迴圈次數易搞錯嚴防下標越界,特別當心「多1/少1」操作
忘記釋放 → 記憶體洩漏每調用一次丟失一塊記憶體,延遲爆發動態記憶體申請與釋放必須配對,malloc/free 次數必相同(new/delete 同理)
釋放後繼續使用1.物件關係複雜難判斷 2.return 回傳堆疊指標 3.free/delete 後未置 NULL1.重新設計資料結構 2.勿回傳堆疊指標/參考 3.釋放後**立即置 NULL**

核心規則彙整

  • 規則 7-2-1:malloc/new 後立即檢查指標是否 NULL。
  • 規則 7-2-2:別忘了為陣列與動態記憶體賦初值。
  • 規則 7-2-3:避免陣列/指標下標越界,防「多1/少1」。
  • 規則 7-2-4:動態記憶體申請與釋放配對,防洩漏。
  • 規則 7-2-5:free/delete 後立即將指標設為 NULL,防野指標。

7.3 指標與陣列本質差異

兩者在許多場合可互換,易產生等價錯覺。

  • 陣列:靜態區或堆疊建立。陣列名**對應**(非指向)一塊記憶體,位址與容量生命期內不變,僅內容可改。
  • 指標:可隨時指向任意型別記憶體塊,特徵是「可變」,常用於操作動態記憶體。指標遠比陣列靈活,**也更危險**。

下文以字串為例詳細比較兩者特性。

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