發生內存錯誤時間非常麻煩的事情。編譯器不能發現這些錯誤,只能在程序運行時才能捕捉到。
1、內存分配失敗
內存分配失敗卻使用了它
指針p爲函數參數,在函數入口處進行檢查:
assert(p != NULL);
new或malloc申請內存進行判斷:
if(p == NULL)
2、內存沒有初始化
//野指針
int* p;
p = 10;
//報錯,使用了未初始化的變量p
3、內存操作越界
常見的數組越界,發生在下標多‘1’或少‘1’;
指針超過變量範圍(野指針)
4、內存沒有釋放
內存泄漏
5、內存釋放後繼續使用
1、懸空指針(野指針)
常見對策
規則 | |
---|---|
規則1 | 用malloc或new申請內存之後,應該立即檢查指針值是否爲NULL。防止使用指針值爲NULL的內存。 |
規則2 | 不要忘記爲數組和動態內存賦初值。防止將未被初始化的內存作爲右值使用。 |
規則3 | 避免數組或指針的下標越界,特別要當心發生“多1”或者“少1”操作。 |
規則4 | 動態內存的申請與釋放必須配對,防止內存泄漏。 |
規則5 | 用free或delete釋放了內存之後,立即將指針設置爲NULL,防止產生“野指針”。 |
野指針:指向一個已刪除的對象或未申請訪問受限內存區域的指針。
1、未初始化的指針(野指針)
//野指針
int* p;
p = 10;
//報錯,使用了未初始化的變量p
2、懸空指針(野指針)
3、指針越界
4、空指針