2016-09-08 3 views
-3

New Оператор часто сбивает меня с толку, и использование его может привести к утечке памяти, если я забуду использовать delete. Каждый раз, когда мне приходится выделять массив объектов, не зная его длины во время компиляции, я просто использую std::vector. Какой смысл использовать new?Зачем использовать новый оператор вместо std :: vector?

Кроме того, зачем мне нужно использовать оператор new для выделения пространства только для одного экземпляра объекта?

+2

Хорошо ... Это действительно зависит от того, хотите ли вы выделить его в стек или в кучу. «Почему существуют молотки, когда я могу использовать пилы для вырубки древесины?» – byxor

+0

Std :: vector использует новый оператор для выделения памяти. –

+3

Использование std :: vector является хорошим (не используйте 'new' для этих случаев использования)! Если он дойдет до полиморфизма, вам может понадобиться выделенный указатель, но вы можете избежать новых, используя std :: unique_ptr (или std :: shared_ptr, если вам нужно). –

ответ

4

Вы правы. Голая new является evil.

Основная цель - это низкоуровневая сантехника под конструкциями высокого уровня. Все vector s и make_unique s и такие в конечном итоге звонят new глубоко в стандартной библиотеке.

Кроме того, части нижнего уровня предшествуют высоким уровням. До интеллектуальных указателей во многих случаях единственным вариантом был new. Фактически, std::make_unique был введен только в C++ 14, поэтому даже C++ 11 необходимо вызвать new даже при использовании unique_ptr для очистки ресурсов.

+0

Вызов «нового» запаха кода немного больше ИМО. Есть достаточные варианты использования, когда программисты будут использовать простые 'новые' (например: при использовании STL небезопасно) – UnholySheep

+2

@UnholySheep, ок, я назову это * зло *. –

1

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

Объекты, созданные по значению (то есть на стеке), автоматически умирают, когда они выходят за рамки. Деструкторный вызов вставляется компилятором, и память автоматически освобождается при возврате функции.

Обратите внимание, что C++ не является сборкой мусора. Поэтому для каждого new должен быть соответствующий delete. Если вы не введете этот delete, тогда у вас будет утечка памяти.

2

Для нормального использования динамических массивов в большинстве кодов используйте std::vector. Это явно дефолт и предотвращает многие проблемы.

Однако, когда вы знаете, что делаете, и вы хотите получить выигрыш в особых случаях, вы можете увидеть, может ли вам помочь new или malloc. Предпочтительно, вы создаете новый специализированный контейнер, чтобы люди могли продолжать использовать его в качестве обычного контейнера. Или еще лучше вы можете попробовать создать распределитель для существующего контейнера. Как вы, вероятно, заметили, это занимает некоторое время и, вероятно, требует отладки, поэтому, если нет реальной потребности, придерживайтесь стандартных контейнеров и динамических массивов, это std::vector.

+0

Только что узнал (здесь: http: //stackoverflow.com/a/383518/4746978), что на самом деле нет разрыва в производительности между новыми массивами и std :: векторами. – Turms

+1

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

1

Я думаю, что ваш вопрос связан с двумя вещами:

  1. Использование нового оператора: Я просто хочу, чтобы сделать один пример. Управление памятью с помощью «нового» и «удаления» дает программисту управление программой. Некоторые языки программирования содержат сборку мусора, но мы не знаем, когда GC будет работать, что вызывает неопределенность. Однако с системами, требующими низкой задержки, эта неопределенность вызовет проблемы.

  2. С помощью «вектора» нам не нужно создавать динамические массивы с новыми, что является хорошим и вызывает меньше ошибок. На самом деле полезно использовать вектор вместо динамических массивов. Но я не думаю, что использование вектора противоречит использованию нового. Это только создает ситуацию, при которой вы можете избежать использования новых.

  3. Пожалуйста, ознакомьтесь с концепцией RAII. Это полезно для обучения C++.