当前位置 : 主页 > 编程语言 > c++ >

c++内存分区模型(四个区)

来源:互联网 收集:自由互联 发布时间:2021-06-23
c++在程序执行的时候将内存分为四个区: 1.代码区 存放函数体的二进制代码,有操作系统管理 包括你写的那些注释都在这 2.全局区 存放全局变量,静态变量,常量 常量:字符串常量

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  }

看到没有四次输出都一样,因为在这地方我们并没有释放

网友评论