c++內存分區模型(四個區)


c++在程序執行的時候將內存分為四個區:

1.代碼區

存放函數體的二進制代碼,由操作系統管理

包括你寫的那些注釋都在這

2.全局區

存放全局變量,靜態變量,常量

常量:字符串常量

3.棧區

存放函數參數值和局部變量,由編譯器自動分配和釋放

4.堆區

由程序員分配和釋放,如果程序員不釋放,那么程序結束時將由操作系統回收

那么為什么要分為四個區呢?

因為不同區域存放的數據,具有不同生命周期,這大大地使我們編程更加靈活

 

代碼區的特點

存放cpu執行的機器指令

共享(生成一份exe文件即可),只讀(防止程序意外地修改指令)

 

全局區:

它和代碼區都是在程序執行前弄好的

該區域的數據在程序結束后有操作系統回收

存放全局變量,靜態變量,常量

下面做一些演示

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int g_a = 1,g_b = 1;
 5 const int c_g_a = 1;
 6 const int c_g_b = 1;
 7 int main()
 8 {
 9     int a = 1,b = 1;
10     cout << "局部變量a的地址為: " << &a << endl;
11     cout << "局部變量b的地址為: " << &b << endl;
12     
13     cout << "全局變量g_a的地址為: " << &g_a << endl;
14     cout << "全局變量g_b的地址為: " << &g_b << endl;
15     
16     static int s_a = 1,s_b = 1;
17     cout << "靜態變量s_a的地址為: " << &s_a << endl;
18     cout << "靜態變量s_b的地址為: " << &s_b << endl;
19     
20     cout << "字符串常量地址為: " << &"hello world!" << endl;
21     
22     const int l_g_a = 1;
23     const int l_g_b = 1;
24     cout << "全局常量c_g_a的地址為: " << &c_g_a << endl;
25     cout << "全局常量c_g_b的地址為: " << &c_g_b << endl;
26     
27     cout << "局部常量l_g_a的地址為: " << &l_g_a << endl;
28     cout << "局部常量l_g_b的地址為: " << &l_g_b << endl;
29     return 0;
30 }

運行之后看每個變量的地址形式就發現異同了

我的有亂碼

 

3.棧區

存放函數參數值和局部變量,由編譯器自動分配和釋放

需要注意的是函數不能返回局部變量的地址

為什么呢?

看一下下面的代碼

 
         

#include<bits/stdc++.h>
using namespace std;

 
         

int *fun()
{
int a = 110;//局部變量存在棧區,函數執行完后自動釋放
return &a;//返回局部變量地址
}

 
         

int main()
{
int *p = fun();
cout << *p << endl;
cout << *p << endl;
return 0;
}

 
        

為什么第一次輸出是對的而第二次輸出是錯的?

因為編譯器會幫你保留一次這個數據,但不會一直保留。

4.堆區

有程序員分配和釋放,如果程序員不釋放,那么程序結束時將由操作系統回收

c++中用new來開辟相關類型的內存

delet 來釋放

來看看代碼

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int *fun()
 5 {
 6     int *p = new int(101);
 7     return p;
 8  } 
 9  
10  int main()
11  {
12      int *p = fun();
13      cout << *p << endl;
14      cout << *p << endl;
15      cout << *p << endl;
16      cout << *p << endl;
17      return 0;
18  }

看到沒有四次輸出都一樣,因為在這地方我們並沒有釋放

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM