【笔记】C++的内存分区模型

前言

C++的内存分区模型学习笔记

内存分区模型

代码区

  • 程序运行前划分的区域
  • 存放函数体的二进制代码,由操作系统进行管理
  • 代码区的特点
    • 共享:多次执行相同的程序不会重复在代码区生成
    • 只读:防止程序意外的修改它的指令

全局区

  • 程序运行前划分的区域
  • 程序结束后由操作系统释放
  • 存放全局变量、静态变量、常量(字符串常量、const修饰的全局变量(全局常量))

栈区

  • 程序运行后划分的区域
  • 由编译器自动分配和释放
  • 存放函数值、局部变量、函数的形参、const修饰的局部变量(局部常量)等
  • 注意事项
    • 返回值不要返回局部变量的地址,因为栈区的数据在函数执行完后自动释放

堆区

  • 程序运行后划分的区域
  • 由开发者分配和释放(若开发者不释放,程序结束时由操作系统回收)
  • 通过new关键字开辟堆区数据,通过delete关键字释放堆区数据

全局变量和局部变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>

// 全局变量
int global_a = 10;

// const修饰的全局变量
const int const_global_a = 10;

int main() {
// 局部变量
int a = 10;

// 静态变量
static int static_a = 10;

// const修饰的局部变量
const int const_a = 10;
}

堆区数据的管理

手动开辟堆区数据

  • 通过new关键字,开辟堆区数据
  • 返回堆区数据的地址
1
数据类型 * 指针名 = new 数据类型(数据值);

开辟数组数据

  • 返回堆区数组首元素地址
1
数据类型 * 指针名 = new 数据类[数组长度];

手动释放堆区数据

  • 通过delete关键字,释放堆区数据
1
delete 指针名;

释放数组数据

1
delete[] 指针名;

完成

参考文献

哔哩哔哩——黑马程序员