Author:AXYZdong 硕士在读 工科男
有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!
CSDN@AXYZdong,CSDN首发,AXYZdong原创
唯一博客更新的地址为: AXYZdong的博客
B站主页为:AXYZdong的个人主页
系列文章目录
- C++基础入门丨1. 初识C++像极了C语言
- C++基础入门丨2. 数据类型基础
- C++基础入门丨3. 搞明白4类运算符——运算符
- C++基础入门丨4. 程序结构有哪几种?——程序流程结构
- C++基础入门丨5. 数组——一维数组和二维数组
- C++基础入门丨6. 函数——定义、调用和声明
- C++基础入门丨7. 指针——一文搞懂指针
- C++基础入门丨8. 结构体——还需要知道这些
操作系统:Windows 10
IDE:Visual Studio 2019
文章目录
- 系列文章目录
- 1 四个内存分区
- 2 程序运行前
- 3 程序运行后
- 4 new操作符
1 四个内存分区
C++程序在执行时,将内存大方向划分为4个区域
四个区域 | 作用 |
---|---|
代码区 | 存放函数体的二进制代码,由操作系统进行管理的 |
全局区 | 存放全局变量和静态变量和常量 |
栈区 | 由编译器自动分配释放,存放函数的参数值,局部变量等 |
堆区 | 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 |
- 不同区域存放的数据,赋予不同的生命周期,使得编程具有更强灵活性。
2 程序运行前
在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域 代码区 和 全局区。
代码区:
存放 CPU 执行的机器指令。
代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。
代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令。
全局区:
全局变量和静态变量存放在此。
全局区还包含了常量区,字符串常量和其他常量也存放在此。存放
cons
t修饰的 全局常量 和 字符串常量。该区域的数据在程序结束后由操作系统释放。
局部变量和局部常量存放在栈区。
3 程序运行后
程序运行后也分为两个区,栈区 和 堆区。
栈区:
由编译器自动分配释放,存放函数的参数值,局部变量等。
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。
#include using namespace std;int * func(){ int a = 10;//局部变量存放在栈区return &a;}int main() {int * p = func();cout << *p << endl;cout << *p << endl;system("pause");return 0;}
- 第一次打印局部变量的地址时,由于编译器的保留作用,保留了一次局部变量的地址。
- 第二次打印时,出现乱码,此时栈区的局部变量已经被释放。
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收。
在C++中主要利用关键字
new
在堆区开辟内存。
4 new操作符
C++中利用 new
操作符在堆区开辟数据。
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete
语法: new 数据类型
利用 new
创建的数据,会返回该数据对应的类型的指针。
#include using namespace std;int * func(){int * a = new int(10);//使用new开辟一个堆区return a;}int main() {int * p = func();cout << *p << endl;cout << *p << endl;//利用delete释放堆区数据delete p;//cout << *p << endl; //报错,释放的空间不可访问system("pause");return 0;}
#include using namespace std;int main() {int * arr = new int[3];//堆区开辟数组for (int i = 0; i < 3; i++){arr[i] = i + 1;}for (int j = 0; j < 3; j++){cout << arr[j] << endl;}delete[] arr;//释放数组 delete 后加 []system("pause");return 0;}
Reference
- [1]:https://www.bilibili.com/video/BV1VJ411M7WR
—— END ——
如果以上内容有任何错误或者不准确的地方,欢迎在下面 留言。或者你有更好的想法,欢迎一起交流学习~~~
更多精彩内容请前往 AXYZdong的博客