常見的內存錯誤及解決方法

常見的內存錯誤

1 內存分配未成功,卻使用了它

解決方法
    在使用內存之前檢查指針是否爲NULL?

  • 如果指針p是函數的參數,那麼在函數的入口處用assert(p != NULL)進行檢查。
  • 如果是用malloc()或new來申請內存,應該用if(p == NULL)或if(p != NULL)進行防錯處理。

2 內存分配雖然成功,但是尚未初始化就引用它

解決方法

  • 聲明後先初始化爲0。
  • 在真正使用指針之前,一定使其指向某個地址。要麼取某個變量的地址,或者指向鏈表的頭節點。

3 內存分配成功並且已經初始化,但操作越過了內存的邊界

解決方法

  • 使用數組下標(或者指針)時要判斷是否超過數組長度。

4 忘記了釋放內存,造成內存泄露

造成問題

  • 含有這種錯誤的函數每被調用一次就丟失一塊內存。過一段時間系統就會出現提示:內存耗盡

解決方法

  • malloc與free(new/delete)成對使用。
  • 申請空間時就考慮、什麼時候釋放該空間。

5 釋放了內存卻繼續使用它

有三種情況:
(1)程序中的對象調用關係過於複雜,實在難以搞清楚某個對象究竟是否已經釋放了內存,此時就應該重新設計數據結構,從根本上解決對象管理的混亂局面。
(2)函數的return語句寫錯了,注意不要返回指向“棧內存”的“指針”或者“引用”,因爲該內存在函數體結束時被自動銷燬。
(3)使用free或delete釋放內存後,沒有將指針設置爲NULL,導致產生“野指針”;

內存管理的規則

通過上面的5種錯誤描述,先總結如下:

  • 用malloc之後,應該立即檢查指針值是否爲NULL,防止使用指針值爲NULL的內存。
  • 不要忘記爲數組和動態內存賦初值,防止將未被初始化的內存作爲右值使用。
  • 避免數組或指針的下標越界,特別要當心發生“多1”或者“少1”操作。
  • 動態內存的申請與釋放必須配對,防止內存泄露。
  • 用free釋放了內存之後,立即將指針設置爲NULL,防止產生“野指針”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章