C 程式的記憶體模型

2022-06-08 09:57:05 字數 1301 閱讀 5369

c++的個人學習之路!認識記憶體模型,才能更好的理解cpp物件導向的實現

c++的記憶體可以劃分為四個大區域

意義:不同區域存放的資料,賦予不同的生命週期,提高程式設計的靈活性。

程式編譯後,生成了可執行程式,該程式為執行前分為兩個區域(這兩個區域執行前就已經被系統劃分存在了,所以在任何時刻區域的資料被讀到):

在**區中:

全域性區放了有全域性變數和靜態變數

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

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

認識了**區和全域性區後通過下圖可以籠統地看下程式的記憶體模型:

總結:由編譯器自動分配釋放(資料又編譯器管理開闢和釋放),存放函式的引數值,區域性變數等

很簡單理解,在函式執行完後,編譯器會自動釋放掉該函式存放在棧中的資料,此時如果返回區域性變數的位址到外面,則這個位址指向的記憶體空間的資料是被釋放掉的,得到的資料就可能變得千奇百怪。

我們可以試著執行下面的**

#include using namespace std;

int* func() //形引數據也會放在棧中

int main()

執行的結果如下圖所示

為什麼第一次列印的是正確的數字,第二次缺不是呢?這是由於編譯器給我們做了一次保留!第二次就不會再保留了,所以上述說「可能」變得千奇百怪。

與棧區一樣,堆區是由程式執行之後,系統又劃分的乙個區域

與其不同的是,該區的特點是由程式設計師進行記憶體的分配和釋放,若不釋放,程式結束時由系統**,c++中主要利用new關鍵字在堆區開闢記憶體。利用new建立的資料,會返回該資料對應的型別指標

手動釋放利用關鍵字delete。

#include using namespace std;

int * func()

int main()

c 程式的記憶體模型

記憶體分為四個區域,不同區域存放的資料賦予不同的生命週期,靈活程式設計 區 存放函式體的二進位制 由作業系統進行管理 全域性區 存放全域性變數以及常量,由作業系統釋放 棧區 存放函式的引數值,區域性變數,由編譯器自動分配釋放 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 共...

C 程式記憶體模型

區 存放函式體的二進位制 由作業系統進行管理的 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配釋放,存放函式的引數值,區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 記憶體分割槽的意義 不同的區域存放的資料,賦予不同的生命週期,給我們更大的靈...

C 程式設計 程式的記憶體模型

記憶體分割槽模型為4個區 區 存放函式的二進位制 由作業系統進行管理,存放cpu執行的機器指令,區是共享的 共享的目的是對於頻繁被執行的程式,只需要在記憶體中有乙份 即可 區是唯讀的 防止程式意外地修改它的指令 全域性區 存放全域性變數和靜態變數及常量,常量包括字串常量和const修飾的常量 棧區 ...