Динамическое выделение памяти vs std :: vector для закрытого члена класса C ++ - PullRequest
0 голосов
/ 06 марта 2019

При изучении c ++ я обычно (очень часто) сталкиваюсь со следующим советом: «Избегайте динамического выделения памяти как настолько, насколько можете ; вместо этого используйте std :: vectors, поскольку они обрабатывают это для вас».

Итак, мой вопрос: когда я должен использовать динамическое распределение памяти?Все упражнения, которые я делал (я только начинающий), намного проще, используя std::vector;тем не менее мой лектор заставляет нас использовать динамическую память для простых классов (таких как матрицы, геометрические векторы и т. д.) и delete[] в деструкторе.

Единственное преимущество, которое я нашел до сих пор для new;delete[]; (илипо крайней мере то, что я говорю себе для того, чтобы почувствовать, что стоит использовать динамическую память), использует перемещение-копирование и перемещение.

Ответы [ 3 ]

5 голосов
/ 06 марта 2019

std::vector также выполняет динамическое выделение памяти за кулисами (с помощью оператора new).Назначение копирования и перемещения также определено для std::vector, как вы можете видеть здесь , поэтому скорость не будет достигнута, если вы сделаете это вручную.

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

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

3 голосов
/ 06 марта 2019

Существуют ситуации, когда вам может понадобиться реализовать пользовательский контейнер (потому что ни std::vector, ни какой-либо из других стандартных контейнеров библиотеки не соответствуют вашей цели), и в этих случаях может имеет смысл сделать управление памятью вручную.

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

Я согласен со строгими правилами вашего лектора в том смысле, что стоит понимать, что происходит за кулисами. Вы редко, если вообще когда-либо, должны использовать ручное управление памятью, но это помогает понять, как std::unique_ptr / std::vector ( должно ) сделать это для вас, чтобы понять, почему C ++ был построен так, как он есть. Обучение C ++ способом, который полезен в реальном мире, в конечном итоге позволит / заставит вас использовать стандартные библиотечные контейнеры, потому что (как вы правильно заметили), по сути, нет никаких причин когда-либо писать delete.

1 голос
/ 06 марта 2019

Лектор, скорее всего, заставляет вас, чтобы вы поняли, как все работает под капотом.Класс std :: vector, как вы упомянули, обрабатывает все управление динамической памятью, так что вам не нужно писать весь код, чтобы обрабатывать это самостоятельно.Это легко, особенно новичку, который может испортить динамическую память и создать утечку / забыть освободить что-то.

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

...