• 指针(二)- C++内存模型、动态分配内存new和delete


    C++内存模型

    在 C++ 中,程序运行时,内存主要分成个区分别是、数据段代码段 

    • 栈:存储局部变量函数参数和返回值。
    • 堆:储动态开辟内存的变量
    • 数据段:存储全局变量和静态变量
    • 代码段:存储可执行程序的代码常量(例如字符常量)此存储区不可修改

    和堆的主要区别

    1)管理方式不同:栈是系统自动管理的在出作用域时将自动被释放堆需手动释放若程序不释放,程序结束时由操作系统回收

    2)空间大小不同:堆内存的大小受限于物理内存空间;而栈就小得可怜,一般只有8M(可以修改系统参数)

    3)分配方式不同:动态分配静态分配和动态分配(都是自动释放)。

    4)分配效率不同:栈是系统提供的数据结构计算机在底层提供对栈支持进栈出栈有专门的指令效率比较高是由C++函数库提供的。

    5)是否产生碎片:对于栈来说进栈出栈都有着严格的顺序先进后出),不会产生碎片而堆频繁的分配和释放,会造成内存空间的不连续容易产生碎片,太多的碎片会导致性能的下降。

    6)增长方向不同:栈向下以降序分配内存地址堆向上以升序分配内地址

    动态分配内存new和delete

    使用堆区的内存有四个步骤:

    1)声明一个指针

    2)用new运算符向系统申请一块内存,让指针指向这块内存

    3)通过对指针解引用的方法,像使用变量一样使用这块内存

    4)如果这块内存不用了,用delete运算符释放它

    申请内存的语法:new 数据类型(初始值);   // C++11支持{} 

    如果申请成功,返回一个地址;如果申请失败,返回一个空地址(暂时不考虑失败的情况)。

    释放内存的语法:delete 地址;

    释放内存不会失败(还钱不会失败)。

    注意:

    1. 动态分配出来的内存没有变量名,只能通过指向它的指针来操作内存中的数据。
    2. 如果动态分配的内存不用了,必须用delete释放它,否则有可能用尽系统的内存。
    3. 动态分配的内存生命周期与程序相同,程序退出时,如果没有释放,系统将自动回收。
    4. 就算指针的作用域已失效,所指向的内存也不会释放。
    5. 用指针跟踪已分配的内存时,不能跟丢。
    1. #include // 包含头文件。
    2. using namespace std; // 指定缺省的命名空间。
    3. int main()
    4. {
    5. // 1)声明一个指针;
    6. // 2)用new运算符向系统申请一块内存,让指针指向这块内存;
    7. // 3)通过对指针解引用的方法,像使用变量一样使用这块内存;
    8. // 4)如果这块内存不用了,用delete运算符释放它。
    9. // 申请内存的语法:new 数据类型(初始值); // C++11支持{}
    10. // 释放内存的语法:delete 地址;
    11. int* p = new int(5);
    12. cout << "*p=" << *p << endl;
    13. *p = 8;
    14. cout << "*p=" << *p << endl;
    15. delete p;
    16. /* for (int i = 1; i > 0; i++)
    17. {
    18. int* p = new int[100000]; // 一次申请100000个整数
    19. cout << "i="<
    20. }/*
    21. }

     

  • 相关阅读:
    Java复习-多线程编程
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.25 RocketMQ 安装
    Jquery,javascript 的处理机制
    力扣每日一题 矩阵中移动的最大次数 DP
    如何将两个或多个组件嵌入到一个组件中?
    机密计算在国际市场高速发展,以可信执行环境为核心的机密计算成为隐私计算赋能领域主流的解决方案
    求助,有关Kriging 代理模型相关问题
    阿里云CentOS主机开启ipv6
    Java编程技巧:将图片导出成pdf文件
    节假日和汉语拼音接口
  • 原文地址:https://blog.csdn.net/m0_62853489/article/details/127401130