C++ 内存分区管理

一、栈区(Stack)

栈区用来存储函数的参数值、局部变量的值等数据。栈区是自动分配和释放的,函数执行时会在栈区分配空间,函数执行结束时会自动释放这些空间。栈区的数据是连续分配的,由系统自动管理。

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

输出局部变量的地址编译器会报上述错误。

报错原因:

代码示例:如果连续输出局部变量的值,会如何输出?

#include <iostream>
using namespace std;int *func()
{//在栈区中创建局部变量int a = 10;int *ptr = &a;//返回局部变量的地址return ptr;
}int main()
{//调用函数,接收返回值int *p = func();cout<<*p<<endl;//局部变量只能返回一次,返回后栈区开辟的数据由编译器自动释放。cout<<*p<<endl;return 0;
}

运行结果:

10
0

二、堆区(Heap)

堆区用来存储动态分配的内存,程序员可以通过newdelete关键字来手动分配和释放堆区的内存。堆区的数据是不连续分配的,由程序员手动管理。

注:内存由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

 代码示例:使用new和delete创建和释放堆内存,如果程序员不手动释放或者程序没有运行结束,堆内存数据不会自动释放。

#include <iostream>
#include <stdio.h>using namespace std;
int *func()
{//使用new关键字,可以将数据开辟到堆区int *p = new int(10);//返回局部变量的地址return p;
}int main()
{//调用函数,接受返回值int *p = func();cout<<*p<<endl;cout<<*p<<endl;//指针地址cout<<p<<endl;delete p;   //访问到的数据已经被覆盖,或者操作系统已经回收了这块内存等等//这种情况可能会打印出数据,但这是不安全的,不应该依赖这种行为。cout<<*p<<endl;    cout<<p<<endl;    return 0;
}

 运行结果:如果程序员不手动释放或者程序没有运行结束,堆内存数据不会自动释放。

10
10
0x1041620
17063904
0x1041620

 

创建堆内存后,会在栈里自动保存一个指针地址*p,指向堆内存地址0x7....。

三、全局/静态存储区(Global/Static Storage)

全局变量和静态变量存储在全局/静态存储区中。全局变量在程序整个执行过程中都存在,静态变量在程序生命周期内存在,但只能在定义它的函数或文件内访问。

四、代码区(Code)

代码区存储程序的执行代码,是只读的。

以上就是C++中常见的内存分区模型,理解内存分区模型对于理解内存管理和指针操作非常重要。

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

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

相关文章

普通人赚钱途径大盘点:从搬砖到玩转智慧,财富之路任你探索

在生活的大舞台上&#xff0c;每个人都在以自己的方式演绎着赚钱的故事。作为普通人&#xff0c;我们或许没有显赫的财富背景&#xff0c;但赚钱的途径却是多种多样&#xff0c;等待我们去发掘。今天&#xff0c;就让我来为大家盘点一下普通人赚钱的常见途径&#xff0c;看看哪…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

蓝桥杯2023年第十四届省赛真题-冶炼金属

思路&#xff1a;用二分模板&#xff0c;边界r得包含所有的v&#xff0c;check分为小于&#xff0c;大于&#xff0c;等于三种情况。 #include<bits/stdc.h> using namespace std; #define int long long #define endl \n int n; const int N 1e410; int a[N],b[N];int…

【Conda基础命令】使用conda创建、查看、删除虚拟环境及可能的报错处理

文章目录 前言&#xff08;1&#xff09; 在默认路径下创建一个新的虚拟环境&#xff08;2&#xff09; 查看已有的虚拟环境&#xff08;3&#xff09; 删除已有的虚拟环境&#xff08;谨慎操作&#xff09;&#xff08;4&#xff09;激活虚拟环境&#xff08;5&#xff09;退出…

数据结构(七)---树

目录 一.树的基本概念 二.树的性质 三.二叉树 1.二叉树的基本概念 2.特殊的二叉树 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉排序树 &#xff08;4&#xff09;平衡二叉树 3.二叉树的性质 4.完全二叉树…

【运维自动化-配置平台】如何创建业务及拓扑(集群-模块)

业务&#xff0c;是蓝鲸 CD 体系中比较重要的概念和维度&#xff0c;日常使用中主机、进程、业务拓扑的管理都需要依赖已经存在的业务&#xff0c;其他蓝鲸体系产品也基本上都是围绕业务的维度来提供对应的服务和相关的鉴权。1、创建业务/业务集 请确保有创建业务的权限&#…

关于CAS

什么是CAS: CAS:Compare And Swap&#xff0c;比较且交换。 CAS中有三个参数&#xff1a;1.内存中原数据的值V 2.预期值A 3.修改后的数据B Compare&#xff1a;V与A会先比较是否一样 Swap&#xff1a;如果V与A一致&#xff0c;那么就将B写入V 返回操作是否成功 伪代码&…

[生活][杂项] 如何正确打开编织袋

编织袋打开的正确姿势 面对单线分离右边的线头&#xff0c;然后依次拉开即可

产品推荐 | 基于Lattice用于原型和FPGA设计和开发的Avant-E 评估板

01 产品概述 莱迪思半导体Avant-E评估板使设计人员能够快速进行原型设计和FPGA设计测试。它提供对所有 I/O 的访问&#xff0c;以及广泛的内存选项&#xff0c;以实现更快的原型设计和开发。 Avant-E评估板采用LFG1156封装的Avant-E FPGA。该板可以通过 FMC HPC、PMAD 和 Ras…

Claude 3 Opus 效果是否真的可以超过GPT-4?

实测,不仅是超过,而且我个人感觉这个差距甚至大于GPT3.5到GPT4的距离. claude3在长篇理学论文的解析能力是非常显著的,可以扩展补完作者省略的大量运用高等数学,复变函数以及更多数理方法的计算过程,并且将中间过程补完的非常完美.不会漏符号,错符号,偏差数值之类的问题.工科许…

ubuntu在xshell中使用快捷方式操作命令,减少命令行的数入量

第一步 第二步 然后无脑确定 第三步 在xshell的显示方式 方式一 这样就会在每个窗格中进行显示 方式二 效果显示–> 这种窗格的显示是全局的 然后你双击这个process就会自动把命令打在命令行上&#xff0c;减少你的输入量

【Gradle如何安装配置及使用的教程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

新型大数据架构之湖仓一体(Lakehouse)架构特性说明——Lakehouse 架构(一)

文章目录 为什么需要新的数据架构&#xff1f;湖仓一体&#xff08;Lakehouse&#xff09;——新的大数据架构模式同时具备数仓与数据湖的优点湖仓一体架构存储层计算层 湖仓一体特性单一存储拥有数据仓库的查询性能存算分离开放式架构支持各种数据源类型支持各种使用方式架构简…

快速访问github

修改本地hosts文件 GitHub访问慢的原因在于域名解析&#xff0c;通过修改本地的hosts文件&#xff0c;将远程DNS解析改为本地DNS解析。 fang 步骤1&#xff1a;打开hosts文件&#xff08;没有就创建&#xff09; host所在位置&#xff1a; C:\Windows\System32\drivers\etc…

linux@内核@内核版本发展@镜像文件查看内核

文章目录 linux内核介绍简介小结 linux发行版和内核各个linux发行版和内核的关系内核更新追踪GAHWE版的内核 内核版本查看&#x1f60a;linux当前系统内核查看未安装时查看网络搜索内核版本号挂载镜像查看虚拟机启动镜像体验版查看内核版本 linux(内核)版本演进&#x1f60a;相…

python_列表和元组

介绍 列表&#xff08;List&#xff09;和元组&#xff08;Tuple&#xff09;是Python中两种不同的数据结构&#xff0c;它们都可以用来存储一系列的元素。下面是它们的主要特点和区别&#xff1a; 列表&#xff08;List&#xff09; 可变性&#xff1a;列表是可变的&…

【c基础】文件操作

1.fopen和fclose函数 函数原型 FILE *fopen(const char *path, const char *mode); 参数解释&#xff1a; 返回值&#xff1a;fopen打开成功&#xff0c;则返回有效file的有效地址&#xff0c;失败返回NULL。path是文件路径&#xff0c;可以相对路径&#xff0c;可以绝对路径…

C# 将 TextBox 绑定为 KindEditor 富文本

目录 关于 KindEditor 绑定设计 部署 KindEditor 实现代码 小结 关于 KindEditor KindEditor 基于JavaScript 编写&#xff0c;可以与众多WEB应用程序结合。KindEditor 依靠出色的用户体验和领先的技术提供富文本编辑功能&#xff0c;是一款非常受欢迎的HTML在线编辑器。…

400电话如何对接配置SIP

400电话对接配置SIP的基本步骤 要配置400电话对接SIP&#xff0c;通常需要遵循以下基本步骤&#xff1a; 注册和认证&#xff1a;首先需要在相应的云通信平台上注册账号&#xff0c;并进行企业实名认证。 开通语音服务&#xff1a;在通过认证后&#xff0c;需要开通语音服务&…

(007)Blender 根据顶点组分离模型

1.选中模型&#xff0c;并且进入【3D视图】【编辑模式】&#xff1a; 2.选择顶点组&#xff1a; 3.分离选中项&#xff1a;