• C++ 内存分区模型


    目录

    内存分区模型

    内存分区的意义

    代码区域与全局区

    栈区

    堆区

    1.在堆区创建整型数据并释放

    2.在堆区创建整型数据类型的数组


    内存分区模型

    C++执行程序时,将内存分为四个区域:

            1.代码区:存放函数体的二进制代码,由操作系统进行管理。

            2.全局区:存放全局变量、静态变量和常量

            3.栈区:由编译器自动分配释放,存放函数的参数值、局部变量等。

            4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

    内存分区的意义

            不同区域存放的数据赋予不同的生命周期,使得编程更灵活。

    代码区域与全局区

    在程序编译后,生成了exe可执行程序,未执行该程序前分为代码区全局区

    代码区:

            存放CPU执行的机器指令。

            代码区时共享的,共享的目的是对于频繁被执行的程序,只需要内存中有一份代码即可。

            代码区是只读的,使其只读的原因是防止程序意外的修改了它的指令。

    全局区:

            全局变量和静态变量存放在此。

            全局区还包含了常量区、字符串常量和其它常量。

            该区域的数据在程序结束后由操作系统释放。

    如下代码说明了全局变量和局部变量存放在内存中的不同区域中:

    1. #include
    2. using namespace std;
    3. #include
    4. //创建普通的全局变量
    5. int globa_a = 10;
    6. int globa_b = 10;
    7. int main()
    8. {
    9. //创建普通的局部变量
    10. int a = 10;
    11. int b = 10;
    12. cout << "局部变量a的地址为:" << (int)&a << endl;
    13. cout << "局部变量b的地址为:" << (int)&b << endl;
    14. cout << "全局变量a的地址为:" << (int)&globa_a << endl;
    15. cout << "全局变量b的地址为:" << (int)&globa_b << endl;
    16. }

    结果:

    栈区

    由编译器自动分配释放,存放函数的参数值局部变量等。

    注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放。

    1. #include
    2. using namespace std;
    3. int* func()
    4. {
    5. int a = 10; //局部变量 存放在栈区,栈区的数据在函数执行完后自动释放
    6. return &a; //返回局部变量的地址
    7. }
    8. int main()
    9. {
    10. int * p = func(); //接收func函数的返回值,用指针指向a的地址
    11. cout << *p << endl;
    12. cout << *p << endl;
    13. }

    结果:

     发现两次打印的不一样

    第一次能正确打印是因为编译器做了保留,第二次就不再保留了。

    堆区

     由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

    在C++中主要用new在堆区开辟内存,手动释放使用delete操作符

    1.在堆区创建整型数据并释放

    1. #include
    2. using namespace std;
    3. #include
    4. int * func()
    5. {
    6. int * p = new int(10); //在堆区开辟一块内存
    7. return p; //返回这块内存地址
    8. }
    9. int main()
    10. {
    11. //在堆区开辟数据
    12. int *p1 = func();
    13. cout << *p1 << endl;
    14. //释放堆区的数据
    15. delete p1;
    16. }

    结果:

    2.在堆区创建整型数据类型的数组

    1. #include
    2. using namespace std;
    3. #include
    4. int main()
    5. {
    6. int * arr = new int[10]; //在堆区创建包含有10个整型数据的数组
    7. for (int i = 0; i < 10; i++)
    8. {
    9. arr[i] = i;
    10. }
    11. delete[] arr; //释放堆区数组
    12. }

  • 相关阅读:
    RN6752V1 高性能AHD转MIPI&DVP&BT656&BT601芯片方案,目前适用于车载方案居多
    【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)
    Gitlab CI如何实现安全获取ssh-key拉取依赖项目,打包成品
    继承和实现该如何选择
    分享Keil5设置忽略编译过程中的警告
    基于springboot实现智慧外贸平台系统【项目源码+论文说明】
    2018年计网408
    [js电子榨菜]事件传递机制 event propogate
    Elasticsearch和sboot整合
    Java序列化为什么必须实现 Serializable 接口
  • 原文地址:https://blog.csdn.net/ChaoChao66666/article/details/126603658