[使用新运算符时的数组生存期

问题描述 投票:0回答:1

考虑代码(没有有意义的目的):

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点)是否仍在(不必要地)占用了一些内存)?

((我知道该示例可能更简单,但是确实很短。)

c++ memory-leaks heap local-variables
1个回答
1
投票

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

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

即,当调用运算符delete []时,具有动态存储持续时间的数组将被破坏。否则,当程序完成执行时,内存将被释放。

© www.soinside.com 2019 - 2024. All rights reserved.