内存四区模型详解(栈、堆、全局、常量)

一、程序运行时内存分为 4 个区

C++ 在程序运行时,会把内存划分为四个区域,不同区域存放不同数据,生命周期和管理方式也不同:

  1. 代码区
  2. 全局区 / 静态区
  3. 栈区
  4. 堆区

二、1. 代码区

  • 存放程序编译后的二进制机器指令
  • 特点:共享、只读
  • 作用:防止程序被恶意修改、多次运行共用一份代码
  • 我们一般不需要操作这里

三、2. 全局区(全局 / 静态变量区)

存放:

  • 全局变量
  • 静态变量 static
  • 常量区(字符串常量、const 全局变量)

特点:

  • 程序启动时创建,程序结束时由操作系统释放
  • 未初始化的变量会自动清 0

示例:

cpp 复制代码
#include <iostream>
using namespace std;

// 全局变量 → 全局区
int g_a = 10;
// 静态全局变量 → 全局区
static int g_s_b = 20;

int main() {
    // 字符串常量 → 常量区(全局区一部分)
    cout << "hello" << endl;
}

四、3. 栈区(stack)

存放:

  • 函数内的局部变量
  • 函数形参
  • 函数调用现场

特点:

  • 编译器自动分配、自动释放
  • 空间小、分配速度快
  • 先进后出(栈结构)
  • 函数结束,变量立即销毁

典型示例:

cpp 复制代码
void func() {
    int a = 10;        // 局部变量 → 栈区
    char arr[] = "abc"; // 数组 → 栈区
}

⚠️ 重要坑点:**不要返回栈区变量的地址!**函数结束后内存已释放,地址变成野指针。


五、4. 堆区(heap)

存放:

  • new / malloc 出来的动态数据

特点:

  • 程序员手动分配、手动释放
  • 空间大、灵活
  • 不主动释放会一直存在,直到程序结束
  • 容易产生内存泄漏

示例:

cpp 复制代码
void func() {
    // 堆区
    int *p = new int(10);
}

释放:

复制代码
delete p;
p = nullptr;

六、四区总结对比(超清晰)

表格

区域 存放内容 分配释放 生命周期
代码区 二进制指令 系统 整个程序运行期
全局区 全局 / 静态变量、常量 系统 整个程序运行期
栈区 局部变量、形参 编译器自动 函数内
堆区 new 动态数据 手动 new/delete 手动控制

七、经典面试题(必看)

1. 局部变量和全局变量区别?

  • 局部变量在栈区,函数结束销毁
  • 全局变量在全局区,程序结束销毁
  • 全局变量默认初始化为 0,局部变量是随机值

2. 为什么不能返回局部变量地址?

局部变量在栈区,函数结束就销毁,返回的地址变成野指针,访问会崩溃或乱码。

3. new 出来的数据在哪?

堆区,必须手动 delete,否则内存泄漏。


八、新手高频易错点

  1. 以为所有变量都在同一个地方
  2. 返回局部变量地址 / 引用,导致野指针
  3. 只 new 不 delete,造成内存泄漏
  4. 混淆栈区与堆区,导致程序莫名崩溃
  5. 以为静态变量和局部变量一样会自动销毁

九、今日重点总结

  1. C++ 内存四区:代码区、全局区、栈区、堆区
  2. 局部变量 → 栈(自动释放)
  3. 全局 / 静态变量 → 全局区(程序结束释放)
  4. new/malloc → 堆(手动释放)
  5. 严禁返回栈变量地址,堆内存必须配对释放
相关推荐
王老师青少年编程9 小时前
信奥赛C++提高组csp-s之搜索进阶(记忆化搜索案例实践3)
c++·记忆化搜索·方格取数·csp·信奥赛·csp-s·提高组
乐观的山里娃9 小时前
【反八股 01】HashMap 的设计参数是怎么来的
面试
嵌入式ZYXC10 小时前
第3篇:《面试题:I2C为什么要加上拉电阻?阻值怎么选?》
stm32·单片机·嵌入式硬件·面试·职场和发展
Titan202410 小时前
Linux动静态库
linux·服务器·c++
sbjdhjd10 小时前
面试(5)| 3.5 小时面试复盘第五弹:加班出差 + 客户响应 + 压力面全拆解
经验分享·程序人生·面试·职场和发展·开源·跳槽·求职招聘
j_xxx404_10 小时前
MySQL表操作硬核解析:从 CREATE TABLE 到磁盘文件、ALTER TABLE 与 DDL 风险
运维·服务器·数据库·c++·mysql·adb·ai
wuminyu11 小时前
Java锁机制之park和unpark源码剖析
java·linux·c语言·jvm·c++
玖玥拾11 小时前
C/C++ 基础笔记(十一)类的进阶
c语言·c++·设计模式·
AI人工智能+电脑小能手11 小时前
【大白话说Java面试题 第102题】【并发篇】第2题:volatile 能否保证线程安全?
java·安全·面试
-森屿安年-12 小时前
1137. 第 N 个泰波那契数
c++·动态规划