int* array = new int[ 10 ]( );
Это правильное использование нового оператора? Насколько мне известно, предыдущий код будет инициализировать каждый элемент в массиве в 0.
int* array = new int[ 10 ];
Вторая строка кода просто инициализирует массив, но не устанавливает значения в ноль?
Правильный способ использования оператора new зависит от того, что вы собираетесь делать дальше после выделения памяти.
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, это то, что у вас больше нет выбора, инициализировать или нет.
Других решений пока нет …