C++核心编程
内存分区模型
C++程序在执行时,将内存在大方向上分为4个区域,不同区域存放不同的数据,赋予不同的生命周期,提高了编程的灵活性。
- 堆区
由程序员进行分配和释放,若程序员不进行释放,在程序结束时,由操作系统进行回收 - 栈区
由编译器自动分配和释放,存放函数的参数值和局部变量等 - 代码区
存放函数的二进制代码,由操作系统进行管理 - 全局区
存放全局变量、静态变量以及常量(指字符串常量和全局常量),局部变量和局部常量均不在全局区中
验证代码如下:
#include <iostream>
#include <string>
using namespace std;
/*c-const 常量 ,g-global 全局 ,l-local局部 s-static 静态
变量、常量
全局、局部
静态、动态(普通)
*/
//全局普通变量
int g_a = 0, g_b = 1;
//全局普通常量
const int c_g_a = 2, c_g_b = 3;
//全局静态变量
static int s_g_a = 4, s_g_b = 5;
//全局静态常量
static const int s_c_g_a = 6, s_c_g_b = 7;
int main()
{
//局部普通变量
int l_a = 0, l_b = 1;
//局部普通常量
const int c_l_a = 2, c_l_b = 3;
//局部静态变量
static int s_l_a = 4, s_l_b = 5;
//局部静态常量
static const int s_c_l_a = 6, s_c_l_b = 7;
cout << "全局普通变量g_a、g_b的地址分别为" << &g_a << "、" << &g_b << endl << endl;
cout << "全局普通常量c_g_a、c_g_b的地址分别为" << &c_g_a << "、" << &c_g_b << endl << endl;
cout << "全局静态变量s_g_a、s_g_b的地址分别为" << &s_g_a << "、" << &s_g_b << endl << endl;
cout << "全局静态常量s_c_g_a、s_c_g_b的地址分别为" << &s_c_g_a << "、" << &s_c_g_b << endl << endl;
cout << "局部普通变量l_a、l_b的地址分别为" << &l_a << "、" << &l_b << endl << endl;
cout << "局部普通常量c_l_a、c_l_b的地址分别为" << &c_l_a << "、" << &c_l_b << endl << endl;
cout << "局部静态变量s_l_a、s_l_b的地址分别为" << &s_l_a << "、" << &s_l_b << endl << endl;
cout << "局部静态常量s_c_l_a、s_c_l_b的地址分别为" << &s_c_l_a << "、" << &s_c_l_b << endl << endl;
return 0;
}
/*
输出结果:
全局普通变量g_a、g_b的地址分别为006CC140、006CC038
全局普通常量c_g_a、c_g_b的地址分别为006C9BF8、006C9BFC
全局静态变量s_g_a、s_g_b的地址分别为006CC03C、006CC040
全局静态常量s_c_g_a、s_c_g_b的地址分别为006C9C00、006C9C04
局部普通变量l_a、l_b的地址分别为007DFD08、007DFCFC
局部普通常量c_l_a、c_l_b的地址分别为007DFCF0、007DFCE4
局部静态变量s_l_a、s_l_b的地址分别为006CC044、006CC048
局部静态常量s_c_l_a、s_c_l_b的地址分别为006C9C08、006C9C0C
*/
- 程序运行前
程序经过编译后,生成了.exe的可执行程序,在该程序未执行前,内存分为两个区域
- 代码区
- 存放CPU执行的机器指令
- 代码区是共享的,对于频繁被执行的代码,只需要在内存中保存一份代码即可
- 代码区是只读的,防止程序意外修改其指令
- 全局区
- 保存全局变量、静态变量
- 全局区还包含常量区,保存字符串常量和全局常量
- 全局区的数据在程序结束后由操作系统释放
- 程序运行后
- 栈区
- 由编译器自动分配和释放,用于存放函数的参数值和局部变量等
- Tip:不要返回局部变量的地址,栈区开辟的数据会由编译期自动释放
- 堆区
- 由程序员进行分配和释放,若程序员不进行释放,在程序结束时,由操作系统进行回收
- 在C++中主要利用
new
关键字在堆区开辟内存,delete
关键字释放内存
测试代码如下
#include <iostream>
using namespace std;
int main()
{
int* ptr = new int(10);
cout << "指针变量ptr的地址为:" << &ptr << endl;
cout << "指针变量ptr指向(存储)的地址为:" << ptr << endl;
cout << "指针变量ptr所指向(存储)的地址中保存的数据为:" << *ptr << endl;
return 0;
}
/*
输出:
指针变量ptr的地址为:006FFDE8
指针变量ptr指向(存储)的地址为:00C32838
指针变量ptr所指向(存储)的地址中保存的数据为:10
*/
由此可见,指针变量存在栈区,而其指向的地址存在堆区。
感谢黑马程序员C++相关课程