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
三、程序实例逐行详解
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),受版权保护,未经本站书面授权,禁止任何形式的转载、复制或搬运。侵权必究,本站保留依法维权的权利。
还没有评论,来说两句?