C++之存储空间的动态分配和释放

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Davincdada/article/details/78781827

很多时候,我们需要根据问题的实际规模来定义数组的大小,即确定实际需要使用的存储空间的大小,这个时候就要用到动态申请、释放存储空间的方法。

一般情况下,变量存储空间的分配和释放是由系统自动完成的,不需要我们的干预。

  • 对于静态变量,编译时确定其空间,运行时分配,运行结束时自动释放空间。
  • 对于动态变量,程序运行到其作用域的开始和结束处由系统动态分配、撤销其空间。

系统对自动分配内存的变量的访问方式有两种:

  • 通过变量名直接访问
  • 通过指针间接访问

在程序运行中动态申请、释放内存的变量,只能通过指针间接访问。在C++中,new 用于动态申请内存,delete 用于释放。注意:这些内存空间在程序结束前的适当时刻必须通过delete释放。

实例

#include <iostream>
using namespace std;

int main()
{
    int n, *p, i;

    cin >> n;
//申请一个一维数组空间,数据类型是int,返回该内存空间的起始地址
    p = new int[n]; 

    for (i=0; i<n; i++)
        cin >> p[i];
    for (i=0; i<n;i++)
        cout << p[i] << '\t';
    cout << '\n';
//释放new动态申请的内存空间
    delete []p; //==delete [n]p == delete p; 
    return 0;
}

注意:
new运算符有四种格式

  1. p = new int;
  2. p = new int(8);
  3. p = new int[n];
  4. p = new int[m][n];

其中只有格式2内存空间初始化,其他的内存空间初始值是不确定的,需要使用后续的赋值语句和通过指针间接的对其赋值。例如

p = new int;  //返回申请到的内存的起始地址
*p = 8;
(int)num = *p;

当然,不是每次申请都能成功的。为了保证程序正确执行,最好在new后测试返回的地址。若成功,返回空间的首地址;否则返回null空指针。然后对返回值进行相关处理。如下:

float *p;
p = newe float[10];
if (p == NULL)
{
    cout << "动态申请失败,程序终止执行!";
    exit(3);
}
else        #成功则执行程序
...  
delete p;

猜你喜欢

转载自blog.csdn.net/Davincdada/article/details/78781827