Skip to content

内存分区模型

c++程序在执行的时候,将内存大方向分为四块区域.

  • 代码区:存放函数体的二进制代码,由操作系统管理.
  • 全局区:存放全局变量和静态变量以及常量
  • 栈区:由编译器自动分配,存放函数参数值,局部变量
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区存在的意义

不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程.

程序运行前

在程序运行前,生成 exe 可执行程序. 未执行该程序前分为两个区域:

代码区

  • 存放 cpu 执行机械指令.
  • 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码就行.
  • 代码区是只读的,使其只读的原因是防止程序意外修改了他的指令.

全局区

  • 全局变量和静态变量存放在此.
  • 全局区还包括常量区,字符串常量,和其他常量也存放在此.
  • 该区域的数据在程序结束后由操作系统释放.

全局变量

设置在函数之外的变量。

静态变量

在局部变量之前加上 static。

常量

字符串常量

" "之间都字符串是字符串常量.

c++
cout << (int)& "hello world!" << endl;

就会输出这句字符串的地址.

const 修饰的变量
c++
const int c_a;

const 修饰的变量分为:

  • const 修饰的全局变量
  • const 修饰的局部变量 注意:const 修饰的局部变量不在全局区!!!!

栈区

由程序员分配和释放,存放函数数据、局部变量,若程序员不释放,程序结束时由操作系统回收. 注意事项:不要返回局部变量的地址,编译器会自动释放.

堆区

使用 new 开辟一段新内存:

c++
int *p = new int(10);

只要不主动删除,或者程序结束,内容都不会释放.

new 运算符

new 的语法

int *p = new int (10);

如果想释放,运用 delete。

在堆区利用 new 开辟一个数组

int *arr = new int [10]; 释放数组的时候: delete[] arr;