內存分配方式:
1:從靜態存儲區分配:全局變量,靜態變量
2:從棧分配:局部變量,函數參數
3:從堆分配(動態內存分配):使用malloc或者new
原則:使用棧存儲和靜態存儲就能滿足要求,那麼就不要使用動態存儲(造成大得多額外開銷)
常見的內存錯誤:
1:內存分配未成功
使用p==NULL來判斷是否為空可以避免這個問題或者使用異常處理語句來處理錯誤
2:分配成功但是沒有初始化
全局變量和靜態變量以及數組會自動初始化為0,但是其他類型的數據就是隨機系統初始化的,時刻保持一種習慣,創建變量的同時就賦空或者0
3:內存分配成功,但是操作越界,比如在排序算法循環中,經常沒有控制好循環控制變量就很容易出現越界
4:忘記了釋放內存或者釋放了部分內存,造成內存泄漏。開始的時候覺得沒有什麼,當多次出現這個情況就會出現oom
動態分配的內存 malloc和free配對,new delete配對,java中比如各種流打開也要配對關閉,不要太指望gc會自己處理,他只是個機器。
5:釋放了內存卻還在繼續使用
常見的為函數返回指向“棧內存”的指針或者是引用,它使局部作用的變量,函數結束就會自動釋放了
6:釋放了內存,但是沒有重新滯空,產生野指針
! free只是釋放了該指針指向的內存,但是它作為一個獨立的變量還是會存在的,不給他賦值他就亂指形成野指針。
7:誤以為動態分配的內存會自動釋放(很容易忽略!)
void funTest(){
char *p=(char *)malloc(100);
}
調用該函數後分配的指針變量p為局部變量會自動釋放,但是他指向的內存並不會釋放
a:指針釋放,不代表指向的內存釋放;
b:內存釋放,不代表指針釋放;