Int * array = new int [n]; что на самом деле делает эта функция?

Я смущен тем, как создать динамически определенный массив:

 int *array = new int[n];

Я понятия не имею, что это делает. Я могу сказать, что это создание указателя с именем array, указывающего на новый объект/массив int? Кто-нибудь будет объяснять?

Ответ 1

new выделяет объем памяти, необходимый для хранения запрашиваемого объекта/массива. В этом случае n чисел int.

Затем указатель сохранит адрес в этом блоке памяти.

Но будьте осторожны, этот выделенный блок памяти не будет освобожден, пока вы не скажете об этом, написав

delete [] array;

Ответ 2

int *array = new int[n];

Он объявляет указатель на динамический массив типа int и size n.

Немного более подробный ответ: new выделяет память размером, равным sizeof(int) * n байтам, и возвращает память, которая хранится переменной array. Кроме того, поскольку память динамически распределяется с помощью new, вы должны освободить ее вручную, написав (когда вам больше не нужно, конечно):

delete []array;

В противном случае ваша программа будет утечка памяти не менее sizeof(int) * n байтов (возможно, больше, в зависимости от стратегии распределения, используемой реализацией).

Ответ 3

В основном это утверждение делает следующее:

  • Создает целочисленный массив элементов 'n'
  • Выделяет память в HEAP-памяти процесса, поскольку вы используете новый оператор для создания указателя
  • Возвращает действительный адрес (если выделение памяти для требуемого размера, если оно доступно в момент выполнения этого оператора)

Ответ 4

Он выделяет пространство в куче, равное целочисленному массиву размера N, и возвращает указатель на него, который присваивается указателю типа int *, называемому "array"

Ответ 5

Он выделяет столько места в соответствии со значением n, и указатель укажет на массив i.e 1-й элемент массива

int *array = new int[n];

Ответ 6

В C/С++ указатели и массивы (почти) эквивалентны. int *a; a[0]; вернет *a, а a[1]; вернет *(a + 1)

Но массив не может изменить указатель, на который он указывает, в то время как указатель может.

new int[n] выделит некоторые пробелы для "массива"

Ответ 7

Как и в случае с С++ 11, безопасный для памяти способ сделать это (все еще используя аналогичную конструкцию) с std::unique_ptr

std::unique_ptr<int[]> array(new int[n]);

Это создает интеллектуальный указатель на блок памяти, достаточно большой для целых чисел n, который автоматически удаляет себя, когда он выходит из области видимости. Эта автоматическая очистка важна, поскольку она позволяет избежать сценария, когда ваш код завершает работу раньше и никогда не достигает вашего оператора delete [] array;.

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

std::vector<int> array;
array.push_back(1);  // adds 1 to end of array
array.push_back(2);  // adds 2 to end of array
// array now contains elements [1, 2]