Правильный способ использования нового оператора зависит от того, что вы собираетесь делать после выделения памяти.
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, состоит в том, что у вас больше нет выбора на то, инициализируется ли вы.
Второй будет выполнять инициализацию по умолчанию, которая для массивов определяется как инициализация элементов по умолчанию. По умолчанию инициализация 'int' является no-op. – dyp
Нет «правильного» использования. Все зависит от ваших потребностей. Вот почему есть разные варианты. Да, первый ноль инициализирует элементы, второй - нет. – juanchopanza
Если вы хотите нули, используйте первый. Если вы этого не сделаете, используйте вторую. – Maroun