C 學習筆記(2) 記憶體分割槽模型

2021-10-09 19:06:06 字數 1760 閱讀 7739

c++程式在執行時,將記憶體大方向劃分為4個區域

題外話:看到堆和棧的時候,想到了之前學習執行緒時的知識。乙個程序可以呼叫pthread_creatre()函式建立多個執行緒。多個執行緒之間共享全域性變數,這就引出了執行緒之間同步的概念,有了條件,鎖等等機制。而各個執行緒之間的棧空間是獨有的。

​ 在程式編譯後,生成了exe可執行程式,未執行該程式前分為兩個區域

**區:

​ 存放 cpu 執行的機器指令

​ **區是共享的,共享的目的是對於頻繁被執行的程式,只需要在記憶體中有乙份**即可

​ **區是唯讀的,使其唯讀的原因是防止程式意外地修改了它的指令

全域性區:

​ 全域性變數和靜態變數存放在此.

​ 全域性區還包含了常量區, 字串常量和其他常量也存放在此.

​ 該區域的資料在程式結束後由作業系統釋放.

具體示意圖如下:

總結:

棧區:

​ 由編譯器自動分配釋放, 存放函式的引數值,區域性變數等

#include

#include

using namespace std;

int*

func()

intmain()

執行結果如下圖:

由上圖可知:在func函式中返回的是區域性變數a的位址,而a是區域性變數,存放在棧中,在函式呼叫結束後自動釋放。理應在主函式中得不到a的值,而第一次輸出a的值的原因是系統會儲存一次,之後徹底釋放。

堆區:

​ 由程式設計師分配釋放,若程式設計師不釋放,程式結束時由作業系統**

​ 在c++中主要利用new在堆區開闢記憶體,利用delete**。

下面為舉例程式:

#include

#include

using

namespace std;

int*

func()

intmain()

c++中利用new操作符在堆區開闢資料

​ 堆區開闢的資料,由程式設計師手動開闢,手動釋放,釋放利用操作符 delete

​ 語法:new 資料型別

​ 利用new建立的資料,會返回該資料對應的型別的指標

示例:開闢陣列

#include

#include

using

namespace std;

intmain()

for(

int i =

0; i <

10; i++

)//釋放陣列 delete 後加

delete

arr;

system

("pause");

return0;

}

c 學習之記憶體分割槽模型

c 程式在執行時,將記憶體大致分為4個取區域。區 存放函式體的二進位制 由作業系統進行管理。全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配釋放,存放函式的引數值 區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時由作業系統 在程式編譯後,生成了.exe可...

C 學習之記憶體分割槽模型

c 程式執行時,主要分為4個區域 區 存放函式體的二進位制 由作業系統進行管理 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配釋放,存放函式的引數值 區域性變數等 堆區 由程式設計師分配釋放,若程式設計師不釋放,程式結束時作業系統 有四個區的概念對於程式設計靈活性提高有很大的幫助...

記憶體分割槽模型(C 學習記錄)

c 程式在執行時,將記憶體大方向劃分為4個區域 記憶體四區意義 不同區域存放的資料,賦予不同的生命週期,給我們更大的靈活程式設計 在程式編譯後,生成了exe可執行程式,未執行該程式前分為兩個區域 1.區 存放 cpu 執行的機器指令.區是共享的,共享的目的是對於頻繁被執行的程式,只需要在記憶體中有乙...