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 }
看到没有四次输出都一样,因为在这地方我们并没有释放
总结以上是内存溢出为你收集整理的c++内存分区模型(四个区)全部内容,希望文章能够帮你解决c++内存分区模型(四个区)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)