一、内存分区
程序在编译后、运行前,存在存在分区的情况,分别是代码区和全局区
1. 代码区
用于存放编写的代码所转的二进制文件
特点:
共享:对于频繁被执行的程序,内存中只有一份代码
只读:防止程序以外修改了指令
2. 全局区:
用于存储全局量、静态量(static)、字符串常量
①全局量
全局变量:写在函数外的变量
全局常量:写在函数外的变量,经const修饰后成为全局常量,被常(const)的内容是不可修改的
②静态量
静态变量:static用于修饰变量,使之以静态存储空间(不会变动地址)来保存内容,生命周期与程序相同,作用域为单个源文件内,与之区别的是extern,作用域为整个程序
“static”是用于控制变量的生命周期和连接方式(可见性)的保留字
静态变量的命名方法:
static int a=10;
③字符串常量
字符串常量:“hello world”为字符串常量
需要注意的是:
局部变量与局部常量存储不存储在全局区中
局部变量:函数里的变量
局部常量:在函数里的变量,经过const修饰后
特点:数据在程序结束后由系统释放
const修饰的 局部变量(函数中的未作特殊修饰的变量)是不在全局区存储的,而和其他局部变量保存在一起
######## 2022.5.3
3.堆区
由程序员分配和释放
在堆区中分配变量的内存空间:
利用new来开辟堆区的新的内存空间
int* func() //
{
int* p = new int(10);// 利用new来开辟堆区的新的内存空间
return p;
}
存放在堆区(程序员自己的空间区)的内存空间没有被销毁
这个指针保存的地址指向的内存是存在的,没有在函数执行完后被释放
int* p = func();
cout << *p << endl;//多次输出依然如常
cout << *p << endl;
cout << *p << endl;
在堆区中释放变量的内存空间:
delete p;
new和delete在数组中的用法:
int* array = new int[10];
for (int i = 0; i < 10; i++)
{
array[i] = 100 + i;
}
for (int i = 0; i < 10; i++)
{
cout << array[i] << endl;
}
delete[] array;
分区的好处:不同的生命周期,更灵活
4.栈区
是编译器自动管理的,用于存放局部变量和函数的参数值等
特点:
重点:
函数不要返回局部变量的地址
栈区的变量在一轮函数执行完后将释放,此时地址已然失效