博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++内存分区模型(四个区)
阅读量:4696 次
发布时间:2019-06-09

本文共 1954 字,大约阅读时间需要 6 分钟。

c++在程序执行的时候将内存分为四个区:

1.代码区

存放函数体的二进制代码,由操作系统管理

包括你写的那些注释都在这

2.全局区

存放全局变量,静态变量,常量

常量:字符串常量

3.栈区

存放函数参数值和局部变量,由编译器自动分配和释放

4.堆区

由程序员分配和释放,如果程序员不释放,那么程序结束时将由操作系统回收

那么为什么要分为四个区呢?

因为不同区域存放的数据,具有不同生命周期,这大大地使我们编程更加灵活

 

代码区的特点

存放cpu执行的机器指令

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

 

全局区:

它和代码区都是在程序执行前弄好的

该区域的数据在程序结束后有操作系统回收

存放全局变量,静态变量,常量

下面做一些演示

1 #include
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
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 }

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

 

转载于:https://www.cnblogs.com/mch5201314/p/11496962.html

你可能感兴趣的文章
Vs2012在Linux应用程序开发(3):加入新平台hi3516
查看>>
adb shell am 的用法
查看>>
实现自动点击
查看>>
MVP开发模式的理解
查看>>
Unity多开的方法
查看>>
File类中的list()和listFiles()方法
查看>>
我的VS CODE插件配置 主要针对.NET和前端插件配置
查看>>
关于js中的事件
查看>>
一致性哈希算法运用到分布式
查看>>
决策树和随机森林->信息熵和条件熵
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>
Maven学习笔记
查看>>
FindChildControl与FindComponent
查看>>
1、简述在java网络编程中,服务端程序与客户端程序的具体开发步骤?
查看>>
C# Web版报表
查看>>
中国城市json
查看>>
android下载手动下载Android SDK
查看>>
北京邮电大学 程序设计课程设计 电梯 文件输入版本(已调试,大致正确运行==)...
查看>>
C++学习:任意合法状态下汉诺塔的移动(原创)
查看>>
学霸修炼的秘籍
查看>>