int * array = new int[n]; что на самом деле делает эта функция?
Я смущен тем, как создать динамический определенный массив:
int *array = new int[n];
Я понятия не имею, что это делает. Я могу сказать, что он создает указатель с именем array, который указывает на новый объект / массив int? Кто-нибудь объяснит?
8 ответов
новая выделяет объем памяти, необходимый для хранения объектов/массив, который вы запрашиваете. В этом случае n чисел int.
указатель хранит адрес этого блока памяти.но будьте осторожны, этот выделенный блок памяти не будут освобождены, пока вы не скажете Это так писать!--4-->
delete [] array;
int *array = new int[n];
он объявляет указатель на динамический массив типа int
и в размере n
.
чуть более подробный ответ: new
выделяет память размером, равным sizeof(int) * n
bytes и возвращает память, которая хранится переменной array
. Кроме того, поскольку память динамически выделяется с помощью new
, вы должны освободить его вручную, написав (Когда вам больше не нужно, конечно):
delete []array;
в противном случае, ваша программа будет утечка памяти не менее sizeof(int) * n
байт (возможно больше, в зависимости от распределения стратегии реализации).
оператор в основном делает следующее:
- создает целочисленный массив' n ' элементов
- выделяет память в памяти кучи процесса, как вы используете новая оператор для создания указателя
- возвращает допустимый адрес (если выделение памяти для требуемого размера, если доступно в момент выполнения данного оператора)
Он выделяет пространство в куче, равное целочисленному массиву размером N, и возвращает указатель на него, который присваивается указателю типа int* под названием "array"
он выделяет столько места в соответствии со значением n, и указатель будет указывать на массив i.e 1-й элемент массива
int *array = new int[n];
в C/C++ указатели и массивы (почти) эквивалентны.
int *a; a[0];
вернутся *a
и a[1];
вернутся *(a + 1)
но массив не может изменить указатель, на который он указывает, в то время как указатель может.
new int[n]
выделит некоторые пробелы для "массива"
начиная с C++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]
на new
оператор выделяет место для блока n
целые числа и присвоение адреса памяти этого блока int*
переменная array
.
общая форма new, применяемая к одномерным массивам, выглядит следующим образом:
array_var = new Type[desired_size];