C++的new和delete的详解以及使用new来创建动态数组

文章目录

    • 使用new来分配空间
    • 使用delete释放内存
    • 使用new来创建动态数组
    • new和delete在使用时需要的注意事项

使用new来分配空间

  • 在C语言中,可以用库函数malloc()来分配内存;在C++中仍然可以这样做,但在C++中使用new运算符

  • 我们只用告诉new,需要为哪种数据类型分配空间,new将找到一个长度正确的内存块(根据类型来确定需要多少字节的内存),并返回该内存块的地址,然后我们需要将该地址赋给一个指针,如:

    int * pn = new int;
    

    该情况下,只能通过指针进行访问。

    我们说pn指向一个数据对象(指的是为数据项分配的内存块),该数据对象可以是结构,也可以是基本类型

  • 使用这种方式的好处是,我们对程序在管理内存方面有更大的控制权

  • new是从被称为(heap)或自由存储区(freee store)的内存区域分配内存

使用delete释放内存

  • delete使得new在使用玩内存后,能够将其归还共给内存池

  • 使用delete时,后面要加上指向内存块的指针,如:

    int * ps = new int;
    ...
    delete ps;
    

使用new来创建动态数组

  • 如果通过声明来创建数组,则在程序被编译时将它分配给内存空间,不管我们是否使用数组,数组都在哪里,占用了空间

  • 但是在使用new时,如果在运行阶段需要数组,则创建它,如果不需要则不创建,还可以在运行时选择数组的长度。

  • 创建方法:

    int * psome = new int [10];
    ...
    delete [] psome;
    

    这里的psome指向的时数组的一个元素

  • 我们还可以使用数组名的方式来使用指针名

    部分代码:

    int * p = new int [3];
    p[0] = 1;
    p[1] = 2;
    p[3] = 3;
    cout << p[1] << "\n"//结果为2
    p = p + 1;
    cout << p[1] << "\n"//结果为3
    //这里将p加1后导致它指向第2个元素而不是第1个
    p = p - 1;
    delete [] p;
    //将它减1后,指针将指向原来的值,这样程序便可以给delete[]提供正确的地址。
    

new和delete在使用时需要的注意事项

  • 不要使用delete来释放不是new分配的内存
  • 不要使用delete释放同一个空间两次
  • 如果使用==new[]为数组分配内存,则应该是使用delete[]==来释放
  • 对空指针应用delete是安全的

你可能感兴趣的:(C++,c++,开发语言)