【C++】C++的内存模型之四大分区
程序的内存模型
C++程序在执行时,将内存大方向划分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理的
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

1.1程序运行前
在程序编译后,生成了exe可执行程序,**【未执行该程序前】**分为两个区域
代码区:
存放CPU执行的机器指令
代码区是**【共享】**的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可
代码区是【只读】的,便其只读的原因是防止程序意外地修改了它的指令
全局区:
全局变量和静态变量存放在此
全局区还包含了常量区,字符串常量和其他常量也存放在此
该区域的数据在程序结束后由操作系统释放
//全局变量
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地址为: " << (int)&a << endl;cout << "局部变量b地址为: " << (int)&b << endl;cout << "全局变量g_a地址为: " << (int)&g_a << endl;cout << "全局变量g_b地址为: " << (int)&g_b << endl;//静态变量static int s_a = 10;static int s_b = 10;cout << "静态变量s_a地址为: " << (int)&s_a << endl;cout << "静态变量s_b地址为: " << (int)&s_b << endl;cout << "字符串常量地址为: " << (int)&"hello world" << endl;cout << "字符串常量地址为: " << (int)&"hello world1" << endl;cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;const int c_l_a = 10;const int c_l_b = 10;cout << "局部常量c_l_a地址为: " << (int)&c_l_a << endl;cout << "局部常量c_l_b地址为: " << (int)&c_l_b << endl;system("pause");return 0;
}


总结:
- C++中在程序运行前分为全局区和代码区
- 代码区特点是共享和只读
- 全局区中存放全局变量、静态变量、常量
- 常量区中存放 const修饰的全局常量 和 字符串常量
1.2程序运行后
栈区:
由编译器自动分配释放,存放函数的参数值(形参),局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据【由编译器自动释放】
示例:
int * func()
{int a = 10;return &a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;//两个*p不一样因为存放在栈区system("pause");return 0;
}
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
在C++中主要利用new在堆区开辟内存
示例:
int* func()
{int* a = new int(10);return a;
}int main() {int *p = func();cout << *p << endl;cout << *p << endl;//两个p值一样,因为存放在堆区system("pause");return 0;
}
总结:
堆区数据由程序员管理开辟和释放
堆区数据利用new关键字进行开辟内存
1.3 new操作符
C++中利用**【new】**操作符在堆区开辟数据
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符**【delete】**
语法: new 数据类型
利用new创建的数据,会返回该数据对应的类型的指针
示例1: 基本语法
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; //报错,释放的空间不可访问system("pause");return 0;
}
示例2:开辟数组
//堆区开辟数组
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;//释放堆空间中的数组system("pause");return 0;
}相关文章:
【C++】C++的内存模型之四大分区
程序的内存模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值&…...
Vue跨级通信(重点)
当不使用Vuex的前提下,子孙传递就得使用另外一种办法:provide 和 inject 总结:provide / inject 类似于消息的订阅和发布。- inject接收数据。- provide提供或发送数据,(1)provide(name…...
支付系统中的设计模式07:责任链模式
最近公司业务的发展果然如老板当初所画(预)饼(言)的那样红(恍)红(恍)火(惚)火(惚),蒸蒸日上,每天的流水都在不断攀升到新的高度,有不少人都从公司开发的电商平台挣到了钱。 不过问题也接着来了——运营部门经过老板的同意,也学着产品经理提出了下面几项非常合理…...
期末综合考试
一、概率论1、全概率公式、贝叶斯公式应用2、期望、方差、协方差的定义以及性质证明(1) 期望(2) 方差(3) 协方差二、数理统计1、参数估计(1) 矩估计(2) 最大似然估计(3) 综合例题一、概率论 1、全概率公式、贝叶斯公式应用 记住标黄的两段,上考场直接套数据&#x…...
数据结构与算法之爬楼梯动态规划
一.题目(爬楼梯)假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬…...
CleanMyMac4.12最新Mac电脑系统垃圾清理神器
CleanMyMac是Mac一款神器,特别是清理已卸载软件残留垃圾文件信息库比较全面。 clearmymac以极其快速和时尚的方式为您提供及时的建议,组织,更新和保护您的Mac。完全支持macOS 11(Big Sur)操作系统;它以其简…...
数据治理如何做?火山引擎 DataLeap 帮助这款产品 3 个月降低计算成本 20%
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 本文讲述字节跳动一款 App 产品的数据治理故事。该产品随着用户体量和数据体量不断增长,数仓的任务量、数据量也不断攀升,运维难、成本贵、稳…...
求职3个月,简历大多都石沉大海,一听是手工测试都纷纷摇头....太难了
距离被上家公司裁员已经过去了3个月了,3个月的求职经历真的让我痛不欲生,我也从中理解感叹到了很多,想写出来,告诫跟我一样的经历的人。 我今年26岁,大学是一所普通的大专,学的是机电专业,如何…...
Visual Studio快捷键汇总
常用快捷键CtrlEC 注释代码CtrlEU 取消注释代码CtrlED 格式化全部代码CtrlShiftA 新建类CtrlRG 删除无效UsingCtrlH 批量替换CtrlG 跳转到指定行CtrlEE 在交互窗口中运行选中代码(很实用)AltEnter 快速引用shiftF9 监控(代码运行时)shiftF6 生成(当前类库)F6 生成(整个解决方案…...
ctf pwn基础-2
今天学了一个保护的绕过,这里讲一讲,这个好像是使用的是格式化字符串漏洞。 目录 基础 实例讲解 基础 首先我们要知道什么是canary保护,就是在入栈EBP以后加一个Canary 我可能讲的不是很好,大家可以看看这些 文章 用通俗一点将就…...
从一个SQL打印全年日历漫谈数据仓库中时间操作场景的重点写法
文章目录前言一、我如何快速确定今年是否是闰年的😣二、 我如何从DATE类型数据获取年、月(月初&月末)、周、日、时、分、秒信息🤯三、我如何快速查到本月月初第一周的周一和本月最后一周周一是在几号😑四、我如何快速确定每个季度的开始和…...
Java跳槽涨薪之路-想学Java的赶紧上车了
前言Java 是近 10 年来计算机软件发展过程中的传奇,在很多开发者心中的地位可谓“爱不释手”,与其他一些计算机语言随着时间的流逝影响也逐渐减弱不同,Java 随着时间的推移反而变得更加强大。按应用范围,Java 可分为 3 个体系&…...
MyBatis解析全局配置文件
目录 MyBatis介绍 传统JDBC和Mybatis相比的弊病 传统JDBC的问题如下 mybatis对传统的JDBC的解决方案 Mybaits整体体系图 使用大致过程 MyBatis 源码编译 源码解析 配置文件解析 读取配置文件 返回SqlSessionFactory 配置文件内容 解析的核心方法 解析出来的对象 …...
37-Golang中的封装
封装介绍 封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作(方法),才能对字段进行操作 封装的理解和好处 1.隐藏实现细节 2.可以对数据进行验证,保证安全合理 如何体现封…...
Python Pytorch开发环境搭建(Windows和Ubuntu)
Python Pytorch开发环境搭建(Windows和Ubuntu) 目录 Pytorch开发环境搭建 1. 安装cuda cudnn (1)Windows安装方法 (2)Ubuntu18.04安装方法 2. 安装Python(推荐使用Anaconda) (1)Windows安装方法 (2)Ubuntu18.04安装方法 3. Pytorch安装 4. 安装…...
多种方法进行去基线处理
目录detrend函数去除基线多项式拟合原函数BEADS 基线处理小波算法经验模态分解(EMD)参考detrend函数去除基线 detrend函数只能用于去除线性趋势,对于非线性的无能为力。 函数表达式:y scipy.signal.detrend(x): 从信号中删除线…...
二叉树——最大二叉树
最大二叉树 链接 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…...
【Redis】Redis 的过期策略以及内存淘汰机制详解
Redis 的过期策略以及内存淘汰机制详解1. Redis 的过期策略1.1 如何设置 key 的过期时间?1.2 key 设置且到了过期时间后,该 key 保存的数据还占据内存么?1.3 Redis 如何删除过期的数据1.3.1 定期删除1.3.2 惰性删除2. Redis 的内存淘汰机制2.…...
边缘云是什么?
涂鸦边缘云服务 旨在解决物联网边缘位置的连接需求和提高设备自主管理能力。并与涂鸦 IoT 云服务和 IoT 终端形成云边端三位一体的端到端产品架构。使用涂鸦边缘云,能极大降低设备响应延时、降低网络带宽压力、提高算力分发能力,并构建以下技术优势&…...
Java常用数据结构
Java常用数据结构 Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。 一、几个常用类的区别 1.…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
