Необходимо ли удалять при возврате массива из функции - PullRequest
0 голосов
/ 30 июня 2018

Когда массив создается в куче внутри функции, необходимо ли удалять массив в основной функции? Считайте, эта программа:

#include "stdafx.h"
#include <iostream>

using namespace std;

int * return_array() {
    int* my_array = new int[10];
    my_array[0] = 10;
    return my_array;
}

int main()
{
    int * returned_array = return_array();
    cout << returned_array[0];
    delete[] returned_array;
    return 0;
}

Эта строка: int* my_array = new int[10]; необходимо ли удалять в основной программе? Я считаю, что делать это каждый раз будет сложно, чтобы поддерживать и получить право.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Любой объект, созданный в бесплатном магазине с new, должен быть очищен с помощью delete. В противном случае у вас будет утечка памяти, поскольку, как только ваш метод вернет память, она не будет освобождена.

0 голосов
/ 30 июня 2018

Да, в коде, который вы написали, вызов delete[] необходим после каждого вызова return_array(), поскольку он выделяет новую память в куче, которая не восстанавливается автоматически. В отличие от Java и других языков более высокого уровня, C ++ не имеет сборщика мусора. Невозможность вызвать delete[] приведет к утечкам памяти и постоянно увеличивающемуся размеру кучи.

Как указано @Ron в комментариях, жизнеспособной альтернативой является использование std::vector<int> (если массив никогда не нужно будет увеличивать, см. Также std::array). Хотя вектор внутренне будет использовать выделение кучи, он также автоматически управляет ими, так что когда они выходят из области видимости, их память автоматически восстанавливается.

#include <vector>

std::vector<int> return_vector() {
    std::vector<int> my_vector(10);
    my_array[0] = 10;
    return my_array;
}

int main()
{
    std::vector<int> returned_vector = return_vector();
    std::cout << returned_vector[0];
    return 0; // vector internal memory is reclaimed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...