文章目錄
- 前言😀
- 一、概念
- 1.1. 內存分區
- 1.1.1 堆區
- 1.1.2 棧區
- 1.1.3 程序代碼區
- 1.1.4 全局/靜態存儲區
- 1.1.5 常量存儲區
- 1.2. 引用
- 二、程序示例
- 總結
前言😀
在C++的內存管理中,堆區和棧區是一個非常重要的概念,理解堆棧的相關知識,會對如何訪問內存以及對內存中內容的調用都會有一個比較清晰的認識。而引用是一個對堆棧進行調用的實例,可以用引用的相關原理加深對堆棧的理解。
一、概念
下面對內存分區和引用的的分類和概念進行簡析。
1.1. 內存分區
在各種資料中對內存區域的劃分都有所不同,三分類,四分類,五分類都有。
三分類:靜態(全局)存儲區;棧區;堆區;
四分類:棧區;堆區;全局區(包含全局/靜態存儲區和常量存儲區);代碼區;
五分類:全局/靜態存儲區;棧區;堆區;常量存儲區;程序代碼區;
個人覺得用五分區比較全面。
1.1.1 堆區
堆區按照程序分配與釋放原則可以這樣定義:
是由程序猿🙈進行分配和釋放內存的,若程序猿啊🙉不釋放,程序結束時操作系統會進行回收。
那么哪些變量會存在堆區呢?
利用new關鍵字在內存上分配內存,用delete釋放。
int* Stack()
{int* p = new int(1);//new返回的是堆區中值為1的地址return p;
}int main()
{ int* p = Stack();cout << *p << endl;delete p;
}
1.1.2 棧區
同樣按照程序分配與釋放原則:由編譯器自動分配和釋放內存。
函數的形參和局部變量都會存在在棧區。
注意:在創建函數時不要返回局部變量的地址,因為局部變量在函數調用完后會自動釋放。
1.1.3 程序代碼區
存放所有二進制代碼的區域,由操作系統進行管理,在程序運行前存在。
代碼區有共享和只讀兩個屬性。
1.1.4 全局/靜態存儲區
在聲明全局變量和靜態變量時,這兩種變量會被分配到同一內存區域中。
//全局變量
int a = 1;int main()
{//局部變量int b = 2;//靜態變量static int c = 3;cout << (int)&a << endl;cout << (int)&b << endl;cout << (int)&c << endl;
}
13017144
11926456
13017148
可以看出:全局變量和靜態變量在一個內存區域,局部變量在棧區中。
1.1.5 常量存儲區
顯而易見:存儲常量的區域。包括字符串常量和全局常量。注意局部常量在局部變量的區域中。
//全局常量
const int a = 1;
//全局變量
int b = 1;int main()
{ //字符串常量cout << (int)&"A" << endl;cout << (int)&a << endl;cout << (int)&b << endl;
}
3832628
3832624
3842048
1.2. 引用
C++中引用實際上是指針常量,我們知道指針常量的概念:可以修改值,但不能改指向。所以引用就是給變量聲明另外一個名字,按照指針常量的概念,可以修改內存中的值,但是不能讓引用指向另外的內存。
引用用&符進行引用的定義。
int a = 1;int c = 1;int &b = a;b = 2;//int& b = c;錯誤cout << b << endl;
二、程序示例
//傳遞引用
void Add(int &a, int &b)
{cout << a + b << endl;
}
//返回引用
int& Add1()
{static int c = 0;//靜態變量在堆中不會被釋放。return c;
}
//避免a和b的值被更改
int Add2(const int &a, const int &b)
{return a+b;
}int main()
{ int a = 1;int b = 2;Add(a, b);int& d = Add1();cout << d << endl;cout << d << endl;Add1() = 1;cout << d << endl;const int& f = 1;//常量引用int k = Add2(a, b);cout << k << endl;
}
3
0
0
1
總結
本文參考了如下資料:
c++堆棧–黑馬程序員筆記
C/C++程序內存的分配
C++的引用&