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]
Ответ 8
Оператор new
выделяет пространство для блока целых чисел n
и назначает адрес памяти этого блока в int*
variable array
.
Общий вид нового, применимый к одномерным массивам, выглядит следующим образом:
array_var = new Type[desired_size];