當編譯乙個c++程式時,計算機的記憶體被分成了4個區域,乙個包括程式的**,乙個包括所有的全域性變數,乙個是堆疊,還有乙個是堆(heap),我們稱堆是自由的記憶體區域,我們可以通過new和delete把物件放在這個區域。
記憶體管理
系統為每個程式建立一虛擬的記憶體空間,這一空間可以分為劃分為三個區域:1)**與資料區。用於存放程式**和預先需要分配空間的資料(如全域性變數、靜態變數)叫靜態儲存區;2)棧區。由系統保留使用,組織的方式和棧一樣,遵循後進先出的規則。用語存放程式的臨時狀態資料,如進行函式呼叫時存放返回位址、傳遞的引數以及區域性變數等,這些空間在退出函式作用域時將會釋放。3)堆,也稱自由儲存區。程式執行期間由程式設計師動態申請的空間在堆中分配。如用new或malloc分配的空間。這些空間需要程式設計師顯式地用delete或free釋放並歸還給堆。
從c++語言的角度來看,c++中的物件/變數按照儲存型別來分,可以分為三種:
1)靜態儲存區
靜態變數被分配在此區段,全域性變數隱含的是靜態的。變數的分配是編譯和鏈結時完成的,但是初始化直到程式中的定義語句處才進行,如果定義時沒有提供初始化表示式,則使用預設值初始化。直到程式結束之前,變數不會被銷毀。
2)棧區
非靜態區域性變數分配在程式的棧(stack)中,他們程式執行到作用域(scope)的開始處分配空間並且初始化(如果有的話),在離開作用域之前被銷毀。因此,變數的建立和銷毀是自動完成的,又叫做自動(automatic)變數,你可以在自動變數前使用auto關鍵字,但是不會產生額外的效果。
3)自由儲存區
使用new建立的變數分配在自由儲存區(free store),變數的建立和銷毀由程式完全的控制,一般使用執行環境(作業系統)提供的功能呼叫介面完成。
存在另一種觀點,認為還有兩種型別:
1)常量區
字面常量存放在該區域,更改此區域的內容的行為其結果不可預期。然而,概念上,字面常量的區域和靜態儲存區的特點是類似的,附加的唯讀保護功能是實現相關的,例如8086實模式下沒有資料段的唯讀保護功能,因此該模式下的程式不可能嚴格區分常量區和靜態儲存區。
2)堆實在難以理解堆(heap)和自由儲存區(free store)的區別,仔細閱讀持這種意見的文章,似乎唯一說得通是heap是malloc/free使用的,而free store是new/delete使用的,由於c++標準並沒有規定new/delete一定用malloc/free實現,因而從這個角度上來看,堆和自由儲存區物理上可能是不相同的。然而,從行為特徵上來看,二者並沒有本質的區別,僅僅是因為實現的差異而已。
[c++標準]
c++標準中使用了前面三種儲存區間的說法,正式的名稱對應為static storage duration(靜態儲存區間),automatic storage duration(自動儲存區間),dynamic storage duration(動態儲存區間)。
C 記憶體管理 C 記憶體分類
c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...
C 記憶體管理
在嵌入式系統中使用c 的乙個常見問題是記憶體分配,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是c 對記憶體的管理非常的容易而且安全。具體地說,當乙個物件被消除時,它的析構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式設計師們過度使用n...
c 記憶體管理
這裡對我暫時所了解的記憶體機制做個記錄,以後再補。首先是記憶體分配 記憶體主要分為3個部分 一是從靜態儲存區域分配。編譯時分配好,主要存放全域性變數,static變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...