內存分配方式:
(1)從靜態存儲區域分配。內存在程序編譯時已經分配好,在程序運行期間都存在。如全局變量、靜態變量
(2)在棧上創建。執行函數時,函數內部局部變量存儲單元都可以在站上創建,函數結束時,這些存儲單元自動釋放。棧內存分配分配的內存容量有限。
(3)從堆上分配,亦動態分配。程序運行時用malloc或new申請任意多少的內存,程序員負責何時用free或delete釋放。動態內存的生存期由我們決定。
常見內存錯誤及解決辦法:
1、內存分配未成功,卻使用了它。
解決辦法:在使用內存之前檢查指針是否為NULL。如果指針P是函數的參數,那麼在函數的 入口處用assert(p != NULL)進行檢查。如果用malloc或new申請內存,應該用if(p == NULL )或if(p != NULL)進行防錯處理。
2、內存雖然分配成功,但是尚未初始化就引用它。
產生錯誤原因:1、沒有初始化的概念2、誤以為內存的缺省初值全為零,導致引用初值錯誤 (例如 數組)。
3、內存分配成功並且已經初始化,但操作越過了內存的邊界。
例如 使用數組時經常發生下標“多1”“少1”的操作。在for循環語句中,循環次數容易搞 錯,導致數組操作越界。
4、忘記釋放內存,照成內存洩露。
含有這種錯誤的函數每被調用一次就丟失一塊內存。剛開始看不到錯誤,終有一次程序突然 死掉,系統提示:內存耗盡。
5、釋放了內存卻繼續使用它。
三種情況:1、程序中調用關系過於復雜,難以搞清楚某個對象究竟是否已經釋放了內存, 此時應該重新設計數據結構,從根本上解決對象管理混亂的局面。2、函數的return語句寫 錯,注意不要返回指向“棧內存”的“指針”或者“引用”,因該內存在函數體結束時被自 動銷毀。3、使用free或delete釋放了內存後,沒有將指針設置為NULL。導致產生“野指針 ”。
C++/C語言沒有辦法知道指針所指的內存容量,除非在申請內存時記住了它。sizeof(p)得到的是指針變量的字節數。
注意當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指針。
(1)指針消亡了,並不表示它所指的內存會被自動釋放。
(2)內存被釋放了,並不表示指針會消亡或者成了NULL指針。
通常有三種方式處理“內存耗盡”的問題:(1)判斷指針是否為NULL,如果是則馬上用return語句終止本函數。(2)判斷指針是否為NULL,如果是則馬上用exit(1)語句終止本函數。(3)為new和malloc設置異常處理函數。