当前位置:网站首页>1.内存分区模型
1.内存分区模型
2022-06-21 12:06:00 【我想要去航海】
C++程序在执行时,将内存大方向划分为4个区域:
1. 代码区:存放函数体的二进制代码,由操作系统进行管理。
2. 全局区:存放全局变量和静态变量以及常量。
3. 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。
4. 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
内存四区的意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活編程。
1.1 程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域。
代码区:
1. 存放CPU执行的机器指令。
2. 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。
3. 代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令。
全局区:
1. 全局变量和静态变量存放在此。
2. 全局区还包括了常量区,字符串常量和其他常量也存放在此。
3. 该区域的数据在程序结束后由操作系统释放。
| 不在全局区 | 在全局区 |
|---|---|
| 局部变量 | 全局变量;静态变量:static关键字 |
| const修饰的局部变量(局部常量) | 常量:字符串常量;const修饰的全局变量(全局常量) |
示例:
#include<iostream>
using namespace std;
// 创建全局变量
int g_a=10;
int main()
{
// 全局区:全局变量,静态变量,常量
// 创建普通局部变量
int a=10;
// 静态变量 在普通变量前面加static,属于静态变量
static int s_a=10;
// 常量:字符串常量 const修饰的全局变量
system("pause");
return 0;
}
1.2 程序运行后
栈区:
1. 由编译器自动分配释放,存放函数的参数值,局部变量等。
2. 注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
示例:
#include<iostream>
using namespace std;
int* func()
{
int a=10; // 局部变量,存放在栈区,栈区的数据在函数执行完毕后自动释放
return &a; // 返回局部变量的地址
}
int main()
{
// 接受func函数的返回值
int* p = func();
cout<<*p<<endl; // 第一次可以打印正确的数字,是因为编译器做了保留
//cout<<*p<<endl; // 第二次这个数据就不再保留了
system("pause");
return 0;
}
堆区:
1. 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收。
2. 在C++中主要利用new在堆区开辟内存。
示例:
#include<iostream>
using namespace std;
int* func()
{
// 利用new关键字 可以将数据开辟到堆区
int* p = new int;
*p=10;
return p;
}
int main()
{
// 在堆区开辟数据
int* p = func();
cout<<*p<<endl;
cout<<*p<<endl;
system("pause");
return 0;
}
1.3 new操作符
C++中利用new操作符在堆区开辟数据。
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete。
语法:new 数据类型
利用new创建的数据,会返回该数据对应的类型的指针。
示例:
#include<iostream>
using namespace std;
// 在堆区利用new开辟数组
void test02()
{
// 创建10整型数据的数组,在堆区
int* arr=new int[10];
for(int i=0; i<10; i++)
{
arr[i] = i+100;
}
for(int j=0; j<10; j++)
{
cout<<arr[j]<<endl;
}
// 释放堆区数组
// 释放数组的时候,要加[]才可以
delete []arr;
}
int main()
{
test02();
system("pause");
return 0;
}
边栏推荐
- Apache ShardingSphere 5.1.2 发布|全新驱动 API + 云原生部署,打造高性能数据网关
- 6-Zabbix监控自动发现第三方中间件内存及CPU使用情况
- SSD的anchor_box计算
- Centos7 升级MySQL5.6.40至企业版5.6.49
- Hands on data analysis data reconstruction
- SDCC编译器 + VSCode开发 8位微控制器
- I would like to ask you guys, the flick CDC will add a table level exclusive lock before extracting the full amount of Oracle data
- i. MX - rt1052 input / output (GPIO)
- Centos7 upgrade MySQL 5.6.40 to enterprise 5.6.49
- WPF uses Maui's self drawing logic
猜你喜欢

uniapp中常用到的方法(部分) - 时间戳问题及富文本解析图片问题

Compilation de l'environnement vs Code + GCC développé par stm32

浅论OCA\UV-OCA LOCA\SLOCA 四种全贴合工艺

自动弹出 微信授权登录窗口

RPC(远程过程调用协议)

看懂UML类图和时序图

Huawei cloud releases desktop ide codearts

i.MX - RT1052 脉宽调制(PWM)

2-zabbix使用自动发现自动添加主机

A recovery solution of system paralysis caused by upgrading glibc of VMware virtual machine
随机推荐
Hands on data analysis data reconstruction
STM32cubeMX之 uart问题汇总
Rename all files in the folder with one click
Brief discussion on four full bonding processes of oca\uv-oca loca\sloca
MySQL 5.6.49 enterprise version setting password complexity policy
i.MX - RT1052输入输出(GPIO)
马斯克的“好朋友”,冲击2022港股最大IPO
Travel does not heal the soul
"Forget to learn again" shell process control - 36. Introduction to the for loop
版本号命名规范
uniapp中常用到的方法(部分) - 时间戳问题及富文本解析图片问题
The final battle of the giant: instant retailing
A recovery solution of system paralysis caused by upgrading glibc of VMware virtual machine
嵌入struct和嵌入interface
Héritage et réécriture des méthodes
PWM (pulse width modulation) of STM32 notes
Centos7 upgrade MySQL 5.6.40 to enterprise 5.6.49
Snow Ice City (blackened)
Vs code + GCC environment compilation for STM32 development
广东发产品检测券,消费者也有份