c++程式的記憶體格局通常分為四個區:
全域性資料區;
**區;
棧區;堆區(即自由儲存區)。
全域性變數、靜態資料、常量存放在全域性資料區,所有類成員函式和非成員函式**存放在**區,為執行函式而分配的區域性變數、函式引數、返回位址等存放在棧區,餘下的空間都被稱為堆區。
new和delete,malloc和free,都從堆中分配和釋放記憶體塊,但在具體操作上兩者有很大的區別。
詳細的記憶體分配情況見:
根據《c++記憶體管理技術內幕》一書,在c++中,記憶體分成5個區,他們分別是堆,棧,自由存續區,全域性/靜態存續區,常量存續區。
a)棧:記憶體由編譯器在需要時自動分配和釋放。通常用來儲存區域性變數和函式引數。(為執行函式而分配的區域性變數、函式引數、返回位址等存放在棧區)。棧運算分配內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
b)堆:記憶體使用new進行分配,使用delete或delete釋放。如果未能對記憶體進行正確的釋放,會造成記憶體洩漏。但在程式結束時,會由作業系統自動**。
c)自由儲存區:使用malloc進行分配,使用free進行**。和堆類似。
d)全域性/靜態儲存區:全域性變數和靜態變數被分配到同一塊記憶體中,c語言中區分初始化和未初始化的,c++中不再區分了。
e) 常量儲存區:儲存常量,不允許被修改。
這裡,在一些資料中是這樣定義c++記憶體分配的,可程式設計內存在基本上分為這樣的幾大部分:靜態儲存區、堆區和棧區。他們的功能不同,對他們使用方式也就不同。
a)靜態儲存區:內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料、全域性資料和常量。
b)棧區:在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
c)堆區:亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意大小的記憶體,程式設計師自己負責在適當的時候用free或 delete釋放記憶體。動態記憶體的生存期可以由我們決定,如果我們不釋放記憶體,程式將在最後才釋放掉動態記憶體。 但是,良好的程式設計習慣是:如果某動態記憶體不再使用,需要將其釋放掉,否則,我們認為發生了記憶體洩漏現象。
C程式的記憶體分配
c語言有五個區 1.stack 用來存放函式的形參和函式內的區域性變數。由編譯器分配空間,在函式執行完後由編譯器自動釋放。2.heap 用來存放由動態分配函式 如malloc new 分配的空間。是由程式設計師自己手動分配的,並且必須由程式設計師使用free釋放。如果忘記用free釋放,會導致所分配...
c程式的記憶體分布
一 c程式的記憶體分布 既然static是用來修飾變數和函式的,而變數和函式又是組成 c程式必不可少的,c程式的 記憶體分布圖如下。c 程式由下面5 部分組成 1 正文段 cpu 執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所...
C程式的記憶體分布
目錄 1.c程式記憶體分布 2.示例詳解 2.1檢視記憶體分布 2.2未初始化全域性變數 2.3未初始化靜態變數 2.4已初始化靜態變數 2.5初始化全域性變數 乙個典型的c程式的記憶體布局包含下面幾個部分 1 text segment code segment 文字 段 2 initialized...