【C++核心】C++内存分区模型分析

news/2024/11/2 3:44:20/

C++程序在执行时,将内存大方向划分为4个区域

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的
  • 全局区:存放全局变量静态变量以及常量
  • 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
  • 堆区由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区意义: 不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程

1. 程序运行前

​ 在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域

代码区: 存放 CPU 执行的机器指令,

1、代码区是 共享 的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
2、代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区: 全局变量和静态变量存放在此.

全局区还包含了常量区, 字符串常量和其他常量也存放在此。该区域的数据在程序结束后由操作系统释放.

示例:

#include<iostream>
using namespace std;//全局变量
int g_a = 10;
int g_b = 10;//全局常量
const int c_g_a = 10;
const int c_g_b = 10;int main() {//局部变量int a = 10;int b = 10;//打印地址cout << "局部变量a地址为: " << &a << endl;cout << "局部变量b地址为: " << &b << endl;cout << "全局变量g_a地址为: " <<  &g_a << endl;cout << "全局变量g_b地址为: " <<  &g_b << endl;//静态变量static int s_a = 10;static int s_b = 10;cout << "静态变量s_a地址为: " << &s_a << endl;cout << "静态变量s_b地址为: " << &s_b << endl;cout << "字符串常量地址为: " << &"hello world" << endl;cout << "字符串常量地址为: " << &"hello world1" << endl;cout << "全局常量c_g_a地址为: " << &c_g_a << endl;cout << "全局常量c_g_b地址为: " << &c_g_b << endl;const int c_l_a = 10;const int c_l_b = 10;cout << "局部常量c_l_a地址为: " << &c_l_a << endl;cout << "局部常量c_l_b地址为: " << &c_l_b << endl;return 0;
}

执行结果为:

局部变量a地址为: 0x309764408
局部变量b地址为: 0x309764404
全局变量g_a地址为: 0x1029720c0
全局变量g_b地址为: 0x1029720c4
静态变量s_a地址为: 0x1029720c8
静态变量s_b地址为: 0x1029720cc
字符串常量地址为: 0x10296deb7
字符串常量地址为: 0x10296dec3
全局常量c_g_a地址为: 0x10296df4c
全局常量c_g_b地址为: 0x10296df50
局部常量c_l_a地址为: 0x309764400
局部常量c_l_b地址为: 0x3097643fc

总结:

  • C++中在程序运行前分为全局区和代码区
  • 代码区特点是共享和只读
  • 全局区中存放全局变量、静态变量、常量
  • 常量区中存放 const修饰的全局常量 和 字符串常量

2. 程序运行后

栈区: 由编译器自动分配释放, 存放函数的参数值,局部变量等

注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

示例:

#include<iostream>
using namespace std;int * func()
{int a = 10;return &a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;return 0;
}

堆区: 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收,在C++中主要利用new在堆区开辟内存

示例:

#include<iostream>
using namespace std;int* func()
{int* a = new int(10);return a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;return 0;
}

总结:

  • 堆区数据由程序员管理开辟和释放
  • 堆区数据利用new关键字进行开辟内存

3. new操作符

C++中利用new操作符在堆区开辟数据,堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete

​ 语法: new 数据类型

​ 利用new创建的数据,会返回该数据对应的类型的指针

案例1: 基本语法

#include<iostream>
using namespace std;int* func()
{int* a = new int(10);return a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;//利用delete释放堆区数据delete p;//cout << *p << endl; //报错,释放的空间不可访问return 0;
}

案例2:开辟数组

#include<iostream>
using namespace std;//堆区开辟数组
int main() {int* arr = new int[10];for (int i = 0; i < 10; i++){arr[i] = i + 100;}for (int i = 0; i < 10; i++){cout << arr[i] << endl;}//释放数组 delete 后加 []delete[] arr;return 0;
}

http://www.ppmy.cn/news/520421.html

相关文章

工具及方法 - 电子烟开发中使用温度测试工具

之前开发的一个电子烟产品&#xff0c;里面有温控的吸烟模式。 使用温控发热丝&#xff0c;其阻值和温度在一定范围内是线性关系。 根据发热丝的电阻变化来判断温度&#xff0c; 所以需要监测发热丝的温度&#xff0c;我们通常是用棉花包住温控探头&#xff0c;伸进卷好的发热…

出口电子烟需要做那些常规的检测认证项目,电子烟的认证标准是什么?

电子烟的健康问题&#xff0c;会造成包括释放有害物质&#xff0c;尼古丁成瘾等危。害。电子烟号称无危害、可代替香烟从而达成戒烟&#xff0c;在年轻一代中收到追捧。中国目前为电子烟最大的生产国和出口国&#xff0c;供应全球90%以上的需求。 那么电子烟出口到各国需要做什…

【王道操作系统】内存管理

内存管理概念 1.C 2.D 存储保护的作用&#xff1a;保证各道作业在各自的存储空间内运行&#xff0c;互不干扰 实现虚拟内存管理需要请求分页&#xff08;请求分段、请求段页&#xff09;等技术的支持&#xff0c;故需要硬件支持&#xff0c;比如页表机制、中断机构、地址变换…

Python编程基础:理解和使用map()函数

在Python中&#xff0c;map()是一个内置函数&#xff0c;用于将一个函数应用于一个或多个可迭代对象的所有元素。map()函数的基本语法如下&#xff1a; map(function, iterable, ...)这里&#xff0c;function 是一个函数&#xff0c;它接收一个参数并返回一个值。iterable是一…

java监听服务器信息,java实时监控服务器状态

java实时监控服务器状态 内容精选 换一换 监控是保持弹性云服务器可靠性、可用性和性能的重要部分,通过监控,用户可以观察弹性云服务器资源。为使用户更好地掌握自己的弹性云服务器运行状态,公有云平台提供了云监控。您可以使用该服务监控您的弹性云服务器,执行自动实时监控…

联想服务器查看告警信息,监控lenovo服务器温度

监控lenovo服务器温度 内容精选 换一换 华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。 本节定义了云手机服务上报云监控的监控指标的命名空间、监…

EMQ优特云-贵阳娃哈哈生产基地物联网能耗监控项目回顾与展望

随着我国经济水平、工业制造业的不断发展&#xff0c;工业生产对环境和资源造成的压力越来越大。为了促进经济和社会的协调发展&#xff0c;国家提出可持续发展的战略目标。由于工业企业中能源消耗是企业正常生产经营中不可或缺的必要条件&#xff0c;且在企业产品成本中占的比…

sum服务器如何接显示器,sum服务器监控

sum服务器监控 内容精选 换一换 本节定义了云手机服务上报云监控的监控指标的命名空间、监控指标列表和维度定义&#xff0c;用户可以通过云监控提供的管理控制台或API接口来检索云手机服务产生的监控指标和告警信息。SYS.CPH云手机服务支持的监控指标包括&#xff1a;云手机服…