C++内存分区

内存分区

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

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

  • 全局区:存放全局变量和静态变量以及常量(不包括局部常量

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

  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区意义:

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

四个区分可以按照程序运行前和程序运行后来划分:
代码区和全局区是程序运行前的区域;栈区和堆区是程序运行后的区域

1. 程序运行前

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

代码区:

​ 存放 CPU 执行的机器指令

代码区的特点:共享&只读

共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可(当多次运行exe文件时,运行的是同一份代码,而不是copy多份)

只读的原因是防止程序意外地修改了它的指令

全局区:

​ 所有的全局变量和静态变量,常量区的部分(全局常量和字符串常量)

全局区的特点:在程序结束后由操作系统释放

代码测试:

变量命名方式:
c:const g:global l:local

#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地址为: " << (int)&a << endl;cout << "局部变量b地址为: " << (int)&b << endl << endl;cout << "全局变量g_a地址为: " << (int)&g_a << endl;cout << "全局变量g_b地址为: " << (int)&g_b << endl << 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 << endl;cout << "字符串常量地址为: " << (int)&"hello world" << endl;cout << "字符串常量地址为: " << (int)&"hello world1" << endl << endl;cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl << 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 << endl;system("pause");return 0;
}
image-20241108191044977

注意到局部变量和局部常量的存储地址都靠得很近 7338… ;全局变量,静态变量,字符串常量和全局常量都靠的很近,这也验证了“全局变量,静态变量,字符串常量和全局常量”都是全局区的;

其中一个容易混淆的是,局部常量虽然也是常量,但是它仍然算局部的,所以不属于全局区

2. 程序运行后

当程序开始执行后,内存会进一步划分为两个区域:栈区和堆区。

栈区(Stack):

栈区是用于存储函数调用时的临时变量,包括函数参数和局部变量。每个函数调用都会在栈上创建一个栈帧(Stack Frame),用于存储局部变量和函数返回地址等信息。
栈区的特点:
后进先出(LIFO):栈是一种特殊的线性表,遵循后进先出的原则,即最后压入栈的元素会最先被弹出。
自动管理:栈的内存分配和释放是由编译器自动管理的,不需要程序员手动干预。
大小有限:栈的大小通常比堆要小,因此不适合存储大量数据。

堆区(Heap):

堆区是用于动态内存分配的区域。程序员可以使用 new 和 delete 操作符来分配和释放堆内存。
堆区的特点:
动态分配:堆内存的分配和释放是由程序员控制的,需要手动使用 new 和 delete 。
大小可扩展:堆的大小理论上可以非常大,受限于操作系统的可用内存。
碎片化:频繁的内存分配和释放可能会导致内存碎片化,影响性能。
代码测试:

#include<iostream>
using namespace std;int* dynamicMemoryAllocation() {// 动态分配内存int* p = new int;*p = 100;cout << "动态分配的内存地址为: " << (int)p << endl;return p;
}void freeMemory(int* p) {// 释放内存delete p;
}int main() {int* p = dynamicMemoryAllocation();cout << "动态分配的内存值: " << *p << endl;freeMemory(p);p = nullptr; // 避免野指针system("pause");return 0;
}

在这个例子中,我们使用 new 操作符在堆区动态分配了一个 int 类型的内存,并存储了一个值。然后使用 delete 操作符释放了这块内存。注意,释放内存后,我们将指针设置为 nullptr ,以避免产生野指针。

总结

通过这四个区域的划分,C++程序能够更有效地管理内存,同时也要求程序员对内存管理有一定的了解,以避免内存泄漏等问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468481.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据面试题--kafka夺命连环问

1、kafka消息发送的流程&#xff1f; 在消息发送过程中涉及到两个线程&#xff1a;一个是 main 线程和一个 sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给双端队列&#xff0c;sender 线程不断从双端队列 RecordAccumulator 中拉取…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

LeetCode:485.最大连续1的个数——简单题简单做

目录 题目——485.最大连续1的个数 题目分析&#xff1a; 图解如下&#xff1a; 代码如下 题目——485.最大连续1的个数 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解…

如何在Android中自定义property

在Android中创建自定义的属性&#xff08;Android property&#xff09;通常用于调试、性能调优或传递应用和系统之间的信息。 以下是如何在Android中创建和使用自定义属性的步骤&#xff1a; 1. 定义属性 在Android中&#xff0c;属性是以“属性名称属性值”形式定义的键值对…

web——sqliabs靶场——第二关

今天来搞第二关&#xff0c;来看看是什么咸蛋 1.判断是否存在sql注入漏洞 输入1 存在sql注入&#xff0c;报错语句为 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near LIMIT 0,1 …

时序预测 | Python基于CNN-transformer时间序列预测

时序预测 | Python基于CNN-transformer时间序列预测 目录 时序预测 | Python基于CNN-transformer时间序列预测预测效果基本介绍参考资料 预测效果 基本介绍 时序预测 | Python基于CNN-transformer时间序列预测 Cnn-transformer-自适应稀疏自注意力ASSA-对比归一化contranorm预…

windows中docker安装redis和redisinsight记录

创建一个Redis运行容器&#xff0c;命令如下 docker run -it -d --name redis -p 6379:6379 redis --bind 0.0.0.0 --protected-mode no -d 代表Redis容器后台运行 --name redis 给创建好的容器起名叫redis -p 6379:6379 将容器的6379端口映射到宿主机的6379端口&#xff0c;注…

ClickHouse创建账号和连接测试

在之前搭建ClickHouse的时候&#xff0c;把账户相关的去掉了&#xff0c;所以登录和连接的时候是不需要账号密码的&#xff0c;但是实际项目中&#xff0c;肯定是需要根据需要创建账号。 一&#xff0c;创建账号 1&#xff0c;进入到 /etc/clickhouse-server&#xff0c; 编辑…

基于微信小程序实现个人健康管理系统

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

基于python的天气数据采集与可视化分析,对20个城市的天气适宜出行度分析

摘要 本项目旨在基于Python对20个城市的天气数据进行采集与可视化分析&#xff0c;以评估天气的适宜出行度。该分析通过四个主要指标进行量化&#xff0c;这些指标分别是天气状况良好率、空气质量优良率、气温适宜率和安全天气率。通过这些指标&#xff0c;我们能够有效地判断…

YOLOv11实战宠物狗分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对5种宠物狗数据集进行训练和优化&#xff0c;该数据集包含丰富的宠物狗图像样本…

电信网关配置管理系统 upload_channels.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

Halcon LED灯带检测分享

目录 原图 检出图 示例代码 函数说明 代码 原图 检出图 示例代码 函数说明 LEDSensitivity : 0.6 LEDMinSize : 35 LEDMaxSize : 400 LEDMethod : 1 LEDType :1 LED (Image, LEDDefectTrans, LEDSensitivity, LEDMethod, LEDType, LEDMinSize, LEDMaxSize, R, G, B,…

Pytest-Bdd-Playwright 系列教程(7):使用测试代码生成辅助工具

Pytest-Bdd-Playwright 系列教程&#xff08;7&#xff09;&#xff1a;测试代码生成辅助工具的使用 前言一、代码生成辅助工具的设计思路1.1 功能概览1.2 适用人群 二、如何使用 pytest-bdd 代码生成器三、代码生成器的实际应用场景3.1 初学者的学习和实践3.2 大规模功能测试3…

【每日刷题】Day152

【每日刷题】Day152 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 176. 判断是否为平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 2. 最大子矩阵_牛客题霸…

【Linux】vmlinux、vmlinuz、zImage、bzImage 的区别

vmlinux vmlinux 是静态链接的可执行文件&#xff0c;但是无法直接加载启动&#xff0c;并且是非压缩的。 zImage and bzImage zImage 和 bzImage 都是 linux 的镜像&#xff08;image &#xff09;&#xff0c;前者用于老系统&#xff0c;后者用于新系统&#xff0c;都采用了…

MaxK B:基于 LLM 大语言模型的知识库问答系统!

推荐一个基于大模型的企业级知识库问答系统&#xff0c;支持管理企业知识库、对话问答、RAG 等功能。 企业知识管理的智能化革新在数字化时代&#xff0c;知识管理对于企业的重要性不言而喻。 MaxK B是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;正是为了解决这一挑…

Spring Boot 集成JWT实现Token验证详解

文章目录 Spring Boot 集成JWT实现Token验证详解一、引言二、JWT和Token基础1、什么是Token2、什么是JWT3、JWT的结构4、JWT的工作原理 三、集成JWT1、引入JWT依赖2、创建Token工具类3、创建拦截器4、注册拦截器 四、总结 Spring Boot 集成JWT实现Token验证详解 一、引言 在现…

前端CSS3 渐变详解

文章目录 CSS3 渐变详解一、引言二、CSS3 渐变基础1、线性渐变1.1、基本线性渐变1.2、改变渐变方向 2、径向渐变2.1、基本径向渐变2.2、设置径向渐变的中心 三、高级渐变技巧1、重复渐变1.1、重复线性渐变1.2、重复径向渐变 四、总结 CSS3 渐变详解 一、引言 在现代网页设计中…

openpyxl处理Excel模板,带格式拷贝行和数据填入

本文中用openpyxl操作Excell 模板,进行行拷贝和数据填充. 主要涉及单元格格式的拷贝,合并单元格的拷贝,行高和列宽的处理. 将模板表格分为三部分,头部,中间循环填充部分,尾部.模板参数中设置头部高度,循环部分高度,剩余为尾部. 拷贝时先拷贝填充头部 ,然后根据数据循环拷贝填…