2014-01-28 3 views
4
int* array = new int[ 10 ](); 

Это правильное использование нового оператора? Насколько мне известно, предыдущий код будет инициализировать каждый элемент массива в 0.C++ надлежащее новое использование?

int* array = new int[ 10 ]; 

ли вторая строка кода просто инициализировать массив, но не устанавливать значения до нуля?

+1

Второй будет выполнять инициализацию по умолчанию, которая для массивов определяется как инициализация элементов по умолчанию. По умолчанию инициализация 'int' является no-op. – dyp

+2

Нет «правильного» использования. Все зависит от ваших потребностей. Вот почему есть разные варианты. Да, первый ноль инициализирует элементы, второй - нет. – juanchopanza

+1

Если вы хотите нули, используйте первый. Если вы этого не сделаете, используйте вторую. – Maroun

ответ

2

Правильный способ использования нового оператора зависит от того, что вы собираетесь делать после выделения памяти.

int* array = new int[10]();будет обнулить память, которую вы выделяете, поскольку она запускает инициализатор int для каждого int в массиве.

int* array = new int[10];не будет инициализировать память, так что значение каждого ИНТ в массиве будет то, что значение было по адресу памяти вы получите от new. Это может быть нули, если вам повезло, но, скорее всего, это, вероятно, мусор, оставленный там из другого запроса/выпуска памяти.

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

Обычно Лучшая причина НЕ инициализировать - это скорость. Установка каждого элемента в массиве до 0 имеет скорость для него, и хотя он может быть небольшим, это может быть заметно, если ваш массив огромен или вы часто выполняете этот код. Это для , когда вы ЗНАЕТЕ, что вы будете устанавливать эти значения, прежде чем использовать их, вы можете сэкономить затраты на их инициализацию без необходимости.

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

std::vector<int> safeArray(10); 
int* array = &safeArray[0]; // array now points to the 0th element in safeArray 

Одна вещь, которую вы теряете с помощью std :: vector, состоит в том, что у вас больше нет выбора на то, инициализируется ли вы.

Смежные вопросы