当前位置: 首页 > news >正文

【C++ 学习笔记】程序运行时的内存四区(操作系统通用规则)

内存分区

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

代码区:存放编译后生成的机器指令(二进制代码),由操作系统进行管理,具有只读,共享特性

全局区:存放全局变量静态变量以及常量(字符串常量、全局 const 变量等),程序生命周期内一直存在

栈区:由操作系统自动分配与释放,存放函数参数、局部变量等,随函数调用/返回自动创建/销毁

堆区:由程序员自己分配(new/malloc)和释放(free/delete),若程序员不释放,程序结束时操作系统自动回收

这样的意义在于,不同区域存放的数据,赋予不同的生命周期,更灵活的同时减少资源浪费

程序运行前

程序编译后,生成.exe可执行文件,存储在硬盘中,其内部已划分出代码段数据段等结构:

(名词解释↓)

代码段:存放编译后生成的机器指令(CPU 可直接执行的二进制代码)

数据段:存放初始化的全局变量、静态变量

BSS段:存放初始化的全局变量、静态变量 (运行时自动初始化为 0)

程序运行后

一、代码区

存放编译后生成的二进制代码

代码区是共享的、只读的。

共享的目的在于节省资源——那些频繁被执行的程序,只需要在内存中有一份代码即可

只读的目的在于防止程序运行时意外地修改其指令

PS:大部分程序都遵循内存共享,但类似于有动态修改代码需求的程序不会遵循。比如一些游戏外挂、加壳反调试软件这些

二、全局区

全局变量、静态变量(static修饰)、常量(如字符串常量、全局const变量)存放于此

特点:程序运行期间一直存在,直到程序结束才会被操作系统释放

补充一点,全局变量和局部变量在内存里基本上隔得相对较远,如下图所示

三、栈区

主要存放:函数参数、局部变量、函数返回地址

由操作系统自动分配与释放,随函数调用自动创建、函数返回自动销毁

存取速度,但空间有限,过量分配会导致栈溢出(比如无限递归)

有时候,局部变量销毁后输出结果依旧正确,这是因为 “销毁” 只是标记这块内存为空闲,数据暂时未被覆盖。但这块内存已不属于当前函数,后续若被其他内存申请覆盖,再访问就会触发未定义行为(不一定立刻报错,可能出现乱码 / 崩溃等)

(所以不要在程序里返回局部变量的地址!)

四、堆区

存放内容:程序员手动申请的动态内存

核心特性:

生命周期由程序员完全控制,若未手动释放,程序结束时会由操作系统兜底回收

空间较大,但存取速度比栈区慢,使用不当容易造成内存泄漏

你可以用new关键字手动开辟内存,new关键字会返回一个内存地址,可以用指针来接收:

int* test() { int * p =new int(10); return p; }

用完了之后别忘了delete掉!

delete p;
http://www.jsqmd.com/news/504751/

相关文章:

  • MLX90614红外测温实战:基于STM32F1软件IIC的寄存器深度解析与高精度应用
  • 手把手教你用DRM和KMS在Linux下实现多屏显示(附代码示例)
  • nodejs+vue基于springboot的大学生学习资料分享信息茧房交流系统设计
  • 2026年口碑好的污泥螺杆泵品牌推荐:压滤机螺杆泵可靠供应商推荐 - 品牌宣传支持者
  • Kiro CLI 自定义 Agent 配置与使用指南
  • Power Writer客户端隐藏技巧:用PWLINK 2批量烧录不同型号芯片的实战方案
  • ChatGPT响应延迟优化实战:从请求排队到并发处理的架构演进
  • 库卡机器人零位校准全流程实操指南(附EMD使用技巧)
  • md2pptx:Markdown到PPT的智能转换创新方法 | 技术工作者效率提升指南
  • 如何快速定位Windows热键冲突?Hotkey Detective终极解决方案
  • 告别无尽的地刷地狱!AIGC联动顶级材质神器:一张图秒转次世代泥泞水坑PBR资产
  • 乐山钵钵鸡优质品牌推荐榜:乐山本地人推荐美食、乐山美食必吃、乐山美食排行榜、乐山美食推荐、乐山美食攻略、乐山美食订餐热线选择指南 - 优质品牌商家
  • 搞懂 Kubernetes Ingress Class|一篇就够,再也不迷路
  • 以太网分层结构
  • 避开Android TV开发初期的那些‘坑’:关于模拟器、焦点控制与Activity选择的实战心得
  • 从原理到实战:用WINS服务替代老式网上邻居,3步提升局域网访问速度200%
  • 商务英语专业学生职业竞争力构建:2026年证书与技能战略规划
  • PMSM FOC控制中SVPWM算法的常见误区与优化技巧(基于STM32实战)
  • 3个强力步骤:用开源插件突破网易云音乐功能限制的完整指南
  • 揭开 K8s 流量大管家的面纱:彻底搞懂 nginx-ingress-controller!
  • 3大核心优势!obs-multi-rtmp多平台直播插件从入门到精通指南
  • ANIMATEDIFF PRO快速部署:RTX 4090专属BF16推理环境一键初始化教程
  • 从‘绝悟’到你的项目:深入拆解Action Mask在PPO中的两大核心应用场景与避坑指南
  • 告别盲目修改!2026硬核测评6款降AI工具,手把手教你构建低AI率“定稿流”
  • 颠覆传统媒体管理:3大创新让你的收藏秒变专业影院
  • Elasticsearch Scroll查询实战:如何高效处理10万+数据的Java实现
  • C的指针使用
  • 通义千问2.5-7B升级攻略:从基础对话到Function Calling高级应用
  • OpenEMS完整教程:如何从零开始构建智能能源管理系统
  • KLayout新手必看:5分钟搞定圆形、文字和复杂图案绘制(附实例截图)