使用 new 运算符时的数组生命周期

Array lifetime when using new operator

考虑代码(没有任何意义):

double* create() {
    double *array = new double[100]; // 1)
    for(unsigned int i=0; i<100; ++i) array[i] = i;
    return array;
}

double reduce(double* array) {
    double sum = 0.0;
    for(unsigned int i=0; i<100; ++i) sum += array[i];
    return sum;
}

int main()
{
    double sum = 0.0;
    for(unsigned int i=0; i<100; ++i) {
        sum += reduce(create());
    }
    // 2)
    // ...
}

for 循环期间在 1) 中创建的数组是否仍在点 2) 的堆上,即在点 2) 是否仍(不必要地)占用了一些内存?

(我知道这个例子可以更简约,但它真的很短。)

数组仍在堆中,但指向数组的指针丢失了。结果出现内存泄漏。

因此,您应该拆分函数的调用,引入一个变量,该变量将存储从函数 create 返回的指针,然后您可以使用该变量来释放分配的数组。

即调用operator delete []时,动态存储期的数组会被销毁。或者当程序执行完毕时,内存将被释放。