c++内存| 内存分区

文章工具

一、五大内存分区

C++ 程序运行时,内存会被划分为5 个独立区域,分别存放不同数据、拥有不同生命周期与访问权限:

1. 栈区(stack)

  • 存放内容
    :函数局部变量、函数参数、函数返回地址、函数调用栈帧
  • 管理方式
    :编译器自动分配、自动释放,无需手动操作
  • 特点
    :空间小、分配速度快、内存连续、遵循 “先进后出”
  • 生命周期
    :函数开始时创建,函数执行结束立即释放

2. 堆区(heap)

  • 存放内容
    :malloc / new 动态申请的内存块
  • 管理方式
    :程序员手动分配、手动释放
    • 分配:malloc / new
    • 释放:free / delete
  • 特点
    :空间大、分配灵活、速度较慢、内存不连续
  • 生命周期
    :从手动申请开始,到手动释放结束;若未释放,程序结束后由操作系统回收

3. 全局 / 静态存储区

  • 存放内容
    :全局变量、static 修饰的静态变量
  • 底层结构
    :分为 .data 段 和 .bss 段
    • .data
       段:存放已初始化的全局 / 静态变量
    • .bss
       段:存放未初始化的全局 / 静态变量(系统默认初始化为 0)
  • C++ 说明
    :语言层面不强制区分两段,统一看作全局 / 静态区
  • 特点
    :程序运行期间一直存在,地址固定
  • 生命周期
    :程序启动分配,程序结束由系统释放

4. 常量存储区(只读数据区)

  • 存放内容
    :字符串常量(如 "abc")、const 修饰的全局只读常量
  • 特点
    :只读不可修改,强行修改会导致程序崩溃
  • 生命周期
    :程序运行期间常驻,结束自动释放

5. 代码区(.text 段)

  • 存放内容
    :编译后生成的二进制机器指令(函数体、程序逻辑)

  • 特点
    :只读可执行,不允许修改,防止指令被意外篡改
  • 生命周期
    :程序加载到内存就存在,程序退出释放



二、内存地址分布(从低地址 → 高地址)

代码区(.text)↓全局/静态区(.data + .bss)↓堆区(向上生长)↓空闲空间↓栈区(向下生长)↓环境变量/env


三、程序实例逐行详解

#include <iostream>using namespace std;// 全局变量,存放在 【全局/静态区】int g_var = 0;        // 已初始化 → .data 段char *gp_var;         // 未初始化 → .bss 段int main(){    int var;                    // 局部变量 → 栈区    char *p_var;                // 指针变量 → 栈区    char arr[] = "abc";         // arr数组本身 → 栈区;"abc"拷贝到栈里    char *p_var1 = "123456";    // p_var1指针 → 栈区;"123456" → 常量区    static int s_var = 0;       // 静态变量 → 全局/静态区(.data段)
    p_var = (char *)malloc(10); // 申请10字节 → 堆区    free(p_var);                // 释放堆区内存
    return 0;}

⚠️ 版权声明

本内容已做唯一性标记(文章 ID:708),受版权保护,未经本站书面授权,禁止任何形式的转载、复制或搬运。侵权必究,本站保留依法维权的权利。