1 記憶體空間邏輯組織
A
待用資料區:記憶體在程式啟動的時候才被分配,而且可能直到程式開始執行的時候才被初始化,如函數中的靜態變數就是在程式第一次執行到定義該變數的代碼時才被初始化。所分配的記憶體在程式的整個運行期間都存在,如全域變數,static變數等。注意:初始化的全域變數和靜態變數在一塊地區,未初始化的全域變數與靜態變數在相鄰的另一塊地區,同時未被初始化的Object Storage Service區可以通過void*來訪問和操縱,程式結束後由系統自行釋放。
B
代碼區:存放函數體的二進位代碼;
C
棧區:存放自動變數。在執行函數時,函數內局部變數的儲存單元都可以在棧上建立,函數執行結束時這些儲存單元由編譯器自動釋放,超出其範圍外的操作沒有定義。棧記憶體配置運算內建於處理器的指令集中,效率很高,但分配的記憶體容量有限。棧存放函數的參數值,局部變數的值等。
D
堆區(自由儲存區):在啟動並執行時候調用程式(如C中的malloc或C++中的new)分配記憶體,可以在任何時候決定分配記憶體及分配的大小,使用者自己負責在何時釋放記憶體(如用free或delete)。堆中的所有東西都是匿名的,這樣不能按名字訪問,而只能通過指標訪問。堆需要一種策略來儲存其記憶體是否已指派的資訊。一種策略是建立一個可用塊(自由儲存區)的鏈表,每塊由malloc分配的記憶體塊都在自己的前面標明自己的大小,一般而言都經過邊界對齊(alignment)處理,堆的大小受限於電腦系統中有效虛擬記憶體。堆的末端由一個稱為break 的指標來標識,當堆管理器需要更多記憶體時,它可以通過系統調用brk和sbrk來移動break指標,一般情況下不必顯式地調用brk,如果分配的記憶體容量很大,brk會被自動調用。用於管理記憶體的調用有:Malloc和free--從堆中獲得記憶體以及把記憶體返回給堆;brk與sbrk――調整資料區段的大小至一個絕對值(通過某個增量)。注意:程式可能無法同時調用malloc()與brk(),因為如果使用了malloc,malloc希望當你調用brk與sbrk時,它具有唯一的控制權。由於sbrk向進程提供了唯一的方法將資料區段記憶體返回給系統核心,所以如果使用了malloc,就有效地防止了程式的資料區段縮小的可能性。此處的堆與資料結構中的堆是兩回事,它的分配方式類似於鏈表。由於堆中的空間由使用者負責分配及釋放,因此需要注意記憶體流失的問題。另外實際上堆區與自由儲存區並不是一回事,詳細資料見exceptional c++條款35。
E
文字常量區(常量資料區):存放常量字串等在編譯期間就能確定的值,在程式結束後由系統自動釋放。類對象不能存在於這個地區中。在本地區中所有的資料都是唯讀,任何企圖修改本地區資料的行為都會造成無法預料的後果。示範記憶體分布的樣本如下:(樣本需要更改完善,同時解決其中的bug)int a = 0; //全域初始化區char *p1; //全域未初始化區main() { int b; //棧char s[] = "abc"; //棧char *p2; //棧char *p3 = "123456"; //123456在文字常量區,p3在棧上。(如何得到文字常量地址?)static int c =0; //全域(靜態)資料區p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得來的10和20位元組的地區就在堆區。(如何得到?)strcpy(p1, "123456"); //123456放在常量區,編譯器可能會將它與p3所指向的"123456"最佳化成一個地方。}