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的博客