目录
内存四区
程序运行前
代码区
全局区
程序运行后
栈区
堆区
new操作符
创建一个数
创建一个数组
内存四区
不同区域存放不同的数据,赋予不同的生命周期,让我们更加灵活的编程
程序运行前
程序运行前就有代码区和全局区
代码区
程序编译后会生成exe可执行程序
代码区存放的是cpu执行的机器指令,二进制01
有两个特点
共享性:
对于频繁执行的代码,程序中只需要有一份
只读性:
不可以被修改,防止程序意外
全局区
存放全局变量与静态变量,常量
可以在编译器内尝试输出它们的地址,全局区的地址会挨在一起,而非全局区的变量又会存在另一块地址处
程序运行后
栈区
栈区内存由编译器自动分配释放
不要返回局部变量的地址,因为局部变量存在栈区,当函数执行完后,栈区的内存会被自动释放
编译器会为我们做一次保留,第二次就不会保留了,而是给我们一段乱码
堆区
由程序员进行分配和释放,如果程序员没释放,程序结束时也会由操作系统回收
使用new关键字,可以将数据开辟到堆区
int *p = new int(10)
示例:开辟内存并且将内存的地址给指针p ,那个地址处存的值为10
指针p还是在栈空间里面,保存的是地址
new操作符
创建一个数
#include<bits/stdc++.h>
using namespace std;
using ll = long long;int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int *p = new int(10);cout << *p << endl;delete p;cout << *p;return 0;
}
第二次会输出乱码
创建一个数组
#include<bits/stdc++.h>
using namespace std;
using ll = long long;int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int * arr = new int[10];//在堆区创立一个含10个元素的数组,arr为该数组的首地址for(int i = 0; i < 10; i++){arr[i] = i;}for(int i = 0; i < 10; i++) cout << arr[i] << endl;return 0;
}
delete[] arr;//释放堆区数组