• C++中new[…]和动态数组


    C++中new[…]和动态数组

    数组类型变量的三个限制
    1.数组长度不变;
    2.编译时必须知道其长度;
    3.数组只能在定义的语句块内存在。

    创建动态数组
    1.可以在运行时再确定数组长度;
    2.动态数组将一直存在,直到程序显式释放它为止;
    3.每一个程序执行时都会占用一块可用的内存空间,用于动态分配对象,此内存空间称为程序的“自由存储区”或“堆”;
    4.c语言使用mallco和free在堆中分配存储空间;
    5.c++语言使用new和delete堆中分配存储空间。

    动态数组的定义
    1.数组变量通过指定类型、数组名和维数来定义:
    int arr[10];
    2.动态分配数组时,不必为数组对象命名,只需要指定类型和数组长度即可,new表达式返回指向该数组的第一个元素的指针,此返回值初始化了指针p;

    int *p = new int[10];
    
    • 1

    3.如果元素有类类型,将使用该类的默认构造函数实现初始化。如果元素是内置类型,则无初始化

    string *p1 = new string[10];//元素使用该string的默认构造函数实现初始化
    int *p2 = new int[10];//元素无初始化
    
    • 1
    • 2

    4.可使用跟在数组长度后面的一对圆括号,对数组元素做值初始化

    5.const对象的动态数组需要对数组初始化

    6.c++不允许定义长度为0的数组变量,但是new动态创建长度为0的数组是合法的。new返回的指针没有指向任何元素,不能进行解引用操作。

    动态数组的释放
    1.动态分配的空间最后必须释放,否则内存最终会逐渐耗尽。如果不再需要动态创建的数组,必须显式得将其占用的存储空间还给程序的自由存储区;
    1.方法:delect [] p;
    2.[]代表删除自由存储区(堆)中的数组,而非单个对象。如果遗漏编译器无法发现这个错误。
    3.理论上遗漏[]至少会导致运行时少释放了内存空间,导致内存泄漏,可能会带来严重的运行错误。

    对于使用 new[…]为一系列元素分配的内存,应使用 delete[]来释放,如程序清单 8.8 所示:

    #include 
    #include 
    using namespace std;
    
    int main()
    {
        cout << "How many integers shall I reserve memory for?" << endl;
        int numEntries = 0;
        cin >> numEntries;
    
        int* myNumbers = new int[numEntries];
    
        cout << "Memory allocated at: 0x" << myNumbers << hex << endl;
    
        // de-allocate before exiting
        delete[] myNumbers;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出:

    How many integers shall I reserve memory for?
    5001
    Memory allocated at: 0x00C71578
    
    • 1
    • 2
    • 3

    分析:

    其中最重要的代码行是第 10 和 15 行,它们分别使用了运算符 new[…]和 delete[]。这个程序根据用户的要求动态地分配内存块,以便能够存储指定数量的 int 变量。前面执行这个程序时,我们请求为 5001 个 int 变量分配内存,但再次运行时,可能要求为 20 或 55000 个 int 变量分配内存。这个程序每次执行时,都将根据用户的要求分配不同的内存。对于这样为数组分配的内存,使用完毕后必须使用 delete[]来释放。

    注意:

    运算符 new 和 delete 分配和释放自由存储区中的内存。自由存储区是一种内存抽象,表现为一个内存池,应用程序可分配(预留)和释放其中的内存。
    
    • 1

    该文章会更新,欢迎大家批评指正。

    推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
    分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
    fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
    TCP/IP,协程,DPDK等技术内容
    点击立即学习:C/C++后台高级服务器课程

  • 相关阅读:
    C++ 基础与深度分析 Chapter10 泛型算法(泛型算法概述、类型、 迭代器元素访问、特殊迭代器、并发算法)
    供应商关系管理的重要性
    mySQL创建表的基础命令
    渗透测试-对新型内存马webshell的研究
    事件绑定方式总结
    Redis:集群(分片)
    SW的stp文件转成CAD格式文件学习笔记
    微信小程序 navigator点击后有阴影 ,去掉navigator阴影效果
    目标检测算法——自动驾驶开源数据集汇总(附下载链接)
    KMP模式匹配算法
  • 原文地址:https://blog.csdn.net/qq_41317716/article/details/133401176