內存管理

1. 內存分配的三種方式: 
(1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。

(2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。 棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。

(3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用 malloc 或 new 申請任意多少的內存,程序員自己負責在何時用 free 或 delete 釋放內存。 動態內存的生存期由我們決定,使用非常靈活,但問題也最多。

2. 常見的內存錯誤及其對策
(1) 內存分配未成功,卻使用了它。
常用解決辦法是,在使用內存之前檢查指針是否爲 NULL。
如果指針 p 是函數的參數,那麼在函數的入口處用 assert(p!=NULL)進行檢查。
如果是用 malloc 或 new 來申請內存,應該用 if(p==NULL) 或 if(p!=NULL)進行防錯處理。 

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

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

(4) 忘記了釋放內存,造成內存泄露。
動態內存的申請與釋放必須配對,程序中 malloc 與 free 的使用次數一定要相同,否則肯定有錯誤(new/delete 同理)。

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

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