堆分配存儲
① 內存的分配方式有哪幾種
內存的三種分配方式:
1. 從靜態存儲區分配:此時的內存在程序編譯的時候已經分配好,並且在程序的整個運行期間都存在。全局變數,static變數等在此存儲。
2. 在棧區分配:相關代碼執行時創建,執行結束時被自動釋放。局部變數在此存儲。棧內存分配運算內置於處理器的指令集中,效率高,但容量有限。
3. 在堆區分配:動態分配內存。用new/malloc時開辟,delete/free時釋放。生存期由用戶指定,靈活。但有內存泄露等問題。
常見內存錯誤及對策
1. 內存分配未成功,卻被使用。
對策:使用內存之前檢查是否分配成功。用p!=NULL判斷。
2. 內存分配成功,未初始化就被使用。
內存的預設值沒有統一的標准。大部分編譯器以0作為初始值,但不完全是。
對策:內存初始化時賦初值。
3. 內存操作越界。
對策:只能是小心了。
4. 釋放了內存,仍然使用。
(1) 使用顯示delete和free的野指針。
對策:釋放完內存,將指針置為NULL。
(2) 使用隱式delete和free的野指針。主要是指函數返回指向棧內存的指針或引用。
對策:當然是不要返回就可以了。
5. 未釋放內存,導致內存泄露。
用new/malloc開辟了內存,沒用delete/free釋放.
對策:new和delete的個數一定相同;malloc和free的個數一定相同;new[]和[]delete一定對應。
② 堆串屬於順序存儲
堆串的本質還是順序存儲,只不過內存是動態分配的。
定長順序存儲結構和堆分配存儲結構都是順序存儲結構,它們的主要區別是前者的串長是固定的。後者的串長是動態串的定長順序存儲結構的缺點是限定了串的長度,若超出長度則約定截斷堆分配存儲表示解決上面的問題,它動態分配串值得存儲空間。
串值共享的存儲空間稱之為堆,串的塊鏈存儲,表示該存儲結構為鏈式存儲結構,存儲密度=串值所佔的儲存位/實際分配的存位塊鏈結構。
是結構中包含頭指針、尾指針、當前串長度的一種結構使用塊鏈結構的目的是為了提高存儲密度。串的堆存儲結構,與定長順序串的存儲結構類似,都是用一維數組地址連續的存儲單元存儲串的字元序列,不同的是堆串的存儲空間是在程序執行過程中動態分配的。
定長順序存儲結構和堆分配存儲結構都是順序存儲結構,它們的主要區別是前者的串長是固定的,後者的串長是動態串的定長順序存儲結構的缺點是限定了串的長度,若超出長度則約定截斷堆分配存儲表示解決上面的問題,它動態分配串值得存儲空間。
③ 程序中動態分配的內存存放在哪個區域
程序中動態分配的內存存放在堆內存區域。
叫「堆」。c語言:char *p1; //若是全局量,則在全局未初始化區,若是局部量,則在棧中。p1 = (char *)malloc(10); //分配得來得10位元組的區域在堆區。
c++語言: 用 new分配,用 delete釋放,在 堆區。用malloc分配,用 free釋放,在類似堆區的自由存儲區。堆不同於棧,它的數據結構並非由系統(無論是機器系統還是操作系統)支持,而是由函數庫提供的。
直接方式:
當時多道程序技術還沒出現,存儲器的可用空間一般是給定的。那時程序員在編程序時或編譯程序對源程序進行編譯時,使用實際的存儲器地址,這種分配方式使用戶與計算機內存直接打交道。
系統資源在某一時刻為一個用戶所獨占。當多道程序出現時就使用戶感到極不方便,因為用戶要自己做主存的分配工作,而且內存不止存放一個作業,這要求用戶必須知道每一個作業放在主存的什麼地方,這無疑增加了用戶的負擔,況且存儲空間的利用率也相當低。