首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++动态内存分配

C++动态内存分配

作者头像
用户11991900
发布2026-01-15 11:32:16
发布2026-01-15 11:32:16
730
举报
在这里插入图片描述
在这里插入图片描述

1.代码段(Code Segment / Text Segment)常量区

  1. 功能 存储程序的可执行机器指令,包括函数体、控制流逻辑和操作码。
  2. 特性 只读且固定:防止程序意外修改自身代码,确保执行安全。 共享性:多个进程可共享同一份代码(如操作系统内核、共享库)。 编译时确定:大小和内容在编译阶段固化,运行时不可变。
  3. 存储内容 函数定义和实现。 字面量字符串(如 “Hello, World!”)。 指令操作码(如加法、跳转指令)。

2. 数据段(Data Segment)静态区

  1. 功能 存储已初始化的全局变量和静态变量。
  2. 特性 读写区域:程序运行时可修改变量值。 初始化值:变量值来自编译时的显式赋值。 持续性:生命周期贯穿程序运行始终。
  3. 存储内容 已初始化的全局变量(如 int global = 42;)。 已初始化的静态变量(如 static int count = 0;)。 全局 / 静态数组(如 char msg[] = “Hi”;)。

3. BSS 段(未初始化数据段)

  1. 功能 存储未初始化的全局变量和静态变量。
  2. 特性 零初始化:运行时自动初始化为 0(或空指针)。 不占磁盘空间:仅在内存中分配,减少可执行文件大小。 读写区域:与数据段相同,但初始值不同。
  3. 存储内容 未初始化的全局变量(如 int global;)。 未初始化的静态变量(如 static int temp;)。 全局 / 静态数组(如 char buffer[1024];)。

4. 堆(Heap)

  1. 功能 动态分配内存,用于运行时创建对象(如 malloc/new),堆是向上增长的。
  2. 特性 手动管理:程序员负责申请(malloc/new)和释放(free/delete)。 动态扩展:通过系统调用(如 brk/mmap)调整大小。 碎片化风险:频繁分配 / 释放可能导致内存碎片,降低利用率。 较大空间:理论上限为虚拟地址空间(如 64 位系统的 16EB)。
  3. 存储内容 动态分配的对象(如 int* ptr = new int[100];)。 运行时创建的数据结构(如链表、树)。 共享内存区域(通过 shm_open 等 API 创建)。

5. 栈(Stack)

  1. 功能 存储函数调用上下文和局部变量,实现函数调用栈。栈是向下增长的。
  2. 特性 后进先出(LIFO):由操作系统自动管理,通过栈指针(SP)操作。 快速访问:通过寄存器直接操作栈顶,速度快于堆。 自动回收:函数返回时自动释放内存,无需手动管理。 固定大小:默认栈深度有限(如 Linux 默认 8MB),可能导致栈溢出。
  3. 存储内容 局部变量(如 int x = 10;)。 函数参数(如 void func(int a, int b) 的 a 和 b)。 调用帧信息(返回地址、寄存器值、栈基址)。 临时变量(如函数内的计算结果)。

6. 内存映射段(Memory Mapping Segment)

  1. 功能 将文件或设备映射到进程地址空间,实现高效 I/O 和共享内存。
  2. 特性 文件映射:通过 mmap() 将文件内容直接映射到内存,避免拷贝。 共享内存:多个进程可映射同一文件,实现进程间通信(IPC)。 动态加载:用于加载共享库(如 .so 文件)。 虚拟内存:仅在访问时实际分配物理内存,节省资源。
  3. 存储内容 动态链接库(如 libc.so)。 通过 mmap() 映射的文件(如配置文件、数据库)。 匿名内存映射(如 MAP_ANONYMOUS 创建的临时缓冲区)。 共享内存对象(如 POSIX 共享内存)。

对比总结

区域

存储内容

生命周期

分配方式

访问速度

风险/注意事项

代码段

可执行指令、字面量字符串

程序运行期间

编译时静态分配

最快

不可修改(修改会触发段错误)

数据段

已初始化全局/静态变量

程序运行期间

编译时静态分配

持续占用内存

BSS段

未初始化全局/静态变量

程序运行期间

运行时零初始化

自动清零,节省磁盘空间

动态分配的对象(malloc/new)

手动管理(free/delete)

运行时系统调用(sbrk/mmap)

较慢

内存泄漏、碎片化、需手动释放

局部变量、函数调用帧

函数执行期间

自动分配/回收(SP指针)

最快

栈溢出(Stack Overflow)

内存映射段

文件映射、共享库、匿名映射

手动管理(munmap)

运行时系统调用(mmap)

中等

需处理映射错误、同步问题

内存布局示意图

代码语言:javascript
复制
高地址 ──────────────────────────────────────────────────────────────────
       │                                                                 │
       │  命令行参数和环境变量                                             │
       ├─────────────────────────────────────────────────────────────────┤
       │                                                                 │
       │  栈 (向下增长)                                                    │
       │    ├─ 函数调用帧                                                   │
       │    ├─ 局部变量                                                     │
       │    └─ ...                                                         │
       │                                                                 │
       ├─────────────────────────────────────────────────────────────────┤
       │                                                                 │
       │  内存映射段                                                        │
       │    ├─ 文件映射                                                      │
       │    ├─ 共享库                                                        │
       │    └─ 匿名映射                                                      │
       │                                                                 │
       ├─────────────────────────────────────────────────────────────────┤
       │                                                                 │
       │  堆 (向上增长)                                                     │
       │    ├─ 动态分配的对象                                                 │
       │    └─ ...                                                         │
       │                                                                 │
       ├─────────────────────────────────────────────────────────────────┤
       │                                                                 │
       │  BSS段 (未初始化数据)                                               │
       │    ├─ 未初始化全局变量                                                │
       │    └─ 未初始化静态变量                                                │
       │                                                                 │
       ├─────────────────────────────────────────────────────────────────┤
       │                                                                 │
       │  数据段 (已初始化数据)                                              │
       │    ├─ 已初始化全局变量                                                │
       │    └─ 已初始化静态变量                                                │
       │                                                                 │
       ├─────────────────────────────────────────────────────────────────┤
       │                                                                 │
       │  代码段 (可执行指令)                                                │
       │    ├─ 函数体                                                        │
       │    └─ 字面量字符串                                                    │
       │                                                                 │
       └─────────────────────────────────────────────────────────────────┘ 低地址
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.代码段(Code Segment / Text Segment)常量区
  • 2. 数据段(Data Segment)静态区
  • 3. BSS 段(未初始化数据段)
  • 4. 堆(Heap)
  • 5. 栈(Stack)
  • 6. 内存映射段(Memory Mapping Segment)
    • 对比总结
    • 内存布局示意图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档