一、內存分配方式
1.從靜態存儲區域分配。內存在程序編譯的過程中就已經分配好,這塊內存在程序的整個運行期間都存在。例如:全局變量和static變量。
2.在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數運行結束時,這些存儲單元會被自動釋放,棧內存分配運算內置於處理器的指令集中,效率很高,但分配的內存數量有限。
3.從堆上分配,又被稱爲動態內存分配。程序在運行過程中用malloc和new申請任意大小的內存,程序員自己負責在何時用free或者delete釋放內存。內存的存在週期由我們自己決定,比較靈活,但同時出現的問題也比較多。
二、經常會出現的內存問題以及問題分析和解決方法
1.內存重複釋放(一般在出現double free時基本上都是這個原因)
*關於double free會在下篇博客中講解
2.內存泄漏。申請的內存忘了釋放。
3.內存越界使用
4.內存未分配成功確使用了它
5.內存分配成功卻沒有初始化就使用了內存
6.使用了無效指針
(1)已經釋放對象,卻繼續操作改指針所指的對象
a.程序當中的對象調用關係過於複雜,是在難以搞清哪個對象是否已經釋放了內存,從根本上解決對象管理混亂的情況。
b.函數的return語句寫錯了,注意不要返回指向“棧內存”的指針或者引用。
c.使用free或者delete釋放之後,沒有將其置空,導致產生野指針。
(2)多線程中某一動態分配的對象同時被兩個線程使用,一個線程釋放了該對象,另一個線程卻繼續對該對象進行操作
三、使用規則
1.在malloc或者new之後應立即檢查是否將其置爲空,防止其使用指針值爲NULL的空間。
2.不要忘記爲指針和數組賦初始值,防止將未被初始化的內存作爲右值使用
3.避免數組或者指針的下標越界,要特別注意多一,少一操作
4.動態內存的申請與釋放必須配對使用,避免出現內存泄漏
5.用free或者delete之後要立即將其置爲空,防止出現“野指針”