1. 程式人生 > 其它 >C++基礎——記憶體模型

C++基礎——記憶體模型

記憶體分割槽模型

程式碼區:存放函式體的二進位制程式碼,由作業系統進行管理;
全域性區:存放全域性變數和靜態變數以及常量;
棧區:由編譯器自動分配釋放,存放函式的引數值、區域性變數等;
堆區:由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統回收。

程式執行前的區域:

程式碼區:

存放CPU執行的機器指令,程式碼區是共享的,只有一份程式碼,是隻讀的。

全域性區:

存放全域性變數(定義在函式{}外的變數)、靜態變數(static修飾的變數)、部分常量(字串常量和const修飾的全域性常量)。
注意:#define巨集定義是不放記憶體的,定義的變數只是替換關係。

程式執行後的區域:

棧區:

存放函式的引數值、區域性變數等
注意:不要返回區域性變數的地址,因為函式執行完作業系統雖然會保留,但其實棧區記憶體已經被釋放了。但是const修飾的引用可以返回並作為左值使用

堆區:

在C++中主要利用new在堆區開闢記憶體,由程式設計師分配釋放,若程式設計師不釋放,整個程式結束時由作業系統釋放。
利用new建立的資料,會返回該資料對應型別的指標。
開闢的資料由程式設計師手動釋放,利用delete操作符。
eg:

int * func() {
  int * p = new int(10);
  return p;
}

釋放:delete p;
指標p也屬於區域性變數,存放在棧區,但是p裡存的是地址,這個地址指向堆區,堆區的記憶體裡值為10。