Как вернуть динамически размещенный массив из функции и правильно удалить его - PullRequest
0 голосов
/ 27 мая 2018

Я новичок в C ++ и у меня проблема с управлением памятью.

У меня есть одна функция a(), которая вызывает 3 функции (b(), c(), d()), каждаяодин из которых возвращает динамически размещенный массив MyClass объектов:

void a(){
    MyClass * one=b();
    MyClass * two=c();
    MyClass * three=d();
    //operate with 3 array (one, two and three)
    delete [] one;
    delete [] two;
    delete [] three;
}

MyClass * b(){
    MyClass * array=new MyClass[2000];
    //many operations on array
    return array;
}

MyClass * c(){
    MyClass * array=new MyClass[2000];
    //many operations on array
    return array;
}

MyClass * d(){
    MyClass * array=new MyClass[2000];
    //many operations on array
    return array;
}

После многих операций в a() я должен удалить 3 массива, которые я создал с помощью 3 функций.Если я сделаю это, используя 3 delete [] выражения, подобные приведенным в коде выше, это нормально?

Я задал себе этот вопрос, потому что я думаю, что этот код освобождает все правильно, но анализируя распределение памяти моегоПрограмма C ++ Я не вижу доказательств этого удаления.

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Да, вы делаете правильно.

Однако учтите, что ручное управление памятью подвержено ошибкам, будь то утечки памяти или двойное удаление. намного лучше забыть о голых new и особенно delete, и вместо этого использовать классы RAII для безопасной обработки.

В вашем случае вы должны заменить указатели на динамическивыделенные массивы с std::vector.std::vector - это способ для написания «динамически распределенного массива» в C ++.Как только вы это сделаете, вы будете знать, что вектор позаботится о правильном освобождении памяти, даже при наличии исключений.

Вот как ваш код может выглядеть с std::vector:

void a(){
    auto one=b();
    auto two=c();
    auto three=d();
    //operate with 3 array (one, two and three)

    //nothing to do here, the vectors will deallocate memory correctly when they go out of scope
}

std::vector<MyClass> b(){
    std::vector<MyClass> array(2000);
    //many operations on array
    return array;
}

std::vector<MyClass> c(){
    std::vector<MyClass> array(2000);
    //many operations on array
    return array;
}

std::vector<MyClass> d(){
    std::vector<MyClass> array(2000);
    //many operations on array
    return array;
}

Что касается того, почему вы не видите эффектов освобождения: память, освобожденная delete, не должна быть немедленно возвращена операционной системе.Довольно часто среда выполнения C ++ сохраняет ее и использует для удовлетворения будущих требований к размещению вашей программы.

0 голосов
/ 27 мая 2018

Для надежного управления памятью вы должны использовать умные указатели, такие как std::unique_ptr.Поэтому, когда ваша функция возвращает динамически распределенное значение, она должна вместо этого вернуть std::unique_ptr к этому значению, чтобы убедиться, что это значение будет освобождено.

std::unique_ptr<MyClass[]> array(new MyClass[2000]);

В вашем случае, однако, вам следует рассмотреть возможность использования std::vectorвместо необработанного массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...