1) 記憶體分配未成功,卻使用了它。
程式設計新手常犯這種錯誤,因為他們沒有意識到記憶體分配會不成功。常用解決辦法是,在使用記憶體之前檢查指標是否為null。如果指標p是函式的引數,那麼在函式的入口處用assert(p!=null)進行檢查。如果是用malloc或new來申請記憶體,應該用if(p==null) 或if(p!=null)進行防錯處理。
2) 記憶體分配雖然成功,但是尚未初始化就引用它。
犯這種錯誤主要有兩個起因:一是沒有初始化的觀念;二是誤以為記憶體的預設初值全為零,導致引用初值錯誤(例如陣列)。記憶體的預設初值究竟是什麼並沒有統一的標準,儘管有些時候為零值,我們寧可信其無不可信其有。所以無論用何種方式建立陣列,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。
3) 記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。
例如在使用陣列時經常發生下標「多1」或者「少1」的操作。特別是在for迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界。
4) 忘記了釋放記憶體,造成記憶體洩露。
5) 釋放了記憶體卻繼續使用它。 有三種情況:(1)程式中的物件呼叫關係過於複雜,實在難以搞清楚某個物件究竟是否已經釋放了記憶體,此時應該重新設計資料結構,從根本上解決物件管理的混亂局面。(2)函式的return語句寫錯了,注意不要返回指向「棧記憶體」的「指標」或者「引用」,因為該內存在函式體結束時被自動銷毀。(3)使用free或delete釋放了記憶體後,沒有將指標設定為null。導致產生「野指標」。【規則7-2-1】用malloc或new申請記憶體之後,應該立即檢查指標值是否為null。防止使用指標值為null的記憶體。【規則7-2-2】不要忘記為陣列和動態記憶體賦初值。防止將未被初始化的記憶體作為右值使用。【規則7-2-3】避免陣列或指標的下標越界,特別要當心發生「多1」或者「少1」操作。【規則7-2-4】動態記憶體的申請與釋放必須配對,防止記憶體洩漏。【規則7-2-5】用free或delete釋放了記憶體之後,立即將指標設定為null,防止產生「野指標」。
C C 常見錯誤彙總
筆記本 macbook air,作業系統 macos,ide clion,工具鏈如下圖 出錯原因 片段沒有寫在函式中。解決方法 將 片段寫進函式中。出錯原因 main.cpp中沒有找到對應的函式名宣告,沒有在.cpp引用包含該函式名的標頭檔案.h。解決方法 引入對應標頭檔案。出錯原因 main.cp...
C C 常見錯誤彙總 1
1 undefinedreferenceto gxx personality v0 編譯器用的是gcc,請換成g 2 將乙個原始檔由.cpp 改為.cc 重新make,結果找不到依賴,沒有規則可以生成 進入.deps 資料夾,修改了那個檔案字尾就好了 3 程式中用了sizeof,根據乙份指導,我一般...
C C 結構體常見錯誤
之前在c語言結構體常見使用方法已經說過結構體其實是對一塊空間的劃分與使用,那麼無論怎麼折騰怎麼改,都是這一畝三分地,只要找到相應位址,直接改也不奇怪 c的一大核心就是指標和位址 1.字串覆蓋其他成員 簡而言之,寫入的字串超出了長度,導致後邊的成員被覆蓋。例如這種結構體和操作 include incl...