Время жизни массива при использовании нового оператора - PullRequest
1 голос
/ 03 апреля 2020

Рассмотрим код (он не имеет смысла):

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)
    // ...
}

Массивы, созданные в 1) во время for-l oop, все еще в куче в точке 2), т. Е. Некоторая память все еще (излишне) занят в пункте 2)?

(я знаю, что пример может быть более минималистичным c, но он действительно короткий.)

1 Ответ

3 голосов
/ 03 апреля 2020

Массив все еще находится в куче, но указатель на массив потерян. В результате происходит утечка памяти.

Таким образом, вы должны разделить вызовы функций, введя переменную, в которой будет храниться указатель, возвращенный из функции create, чтобы затем вы могли использовать переменную для освобождения выделенного массива.

То есть массив с динамической c продолжительностью хранения будет уничтожен при вызове оператора delete []. Или память будет освобождена, когда программа завершит sh ее выполнение.

...