常見的內存錯誤
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,防止產生“野指針”。