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 байт (возможно больше, в зависимости от распределения стратегии реализации).


оператор в основном делает следующее:

  1. создает целочисленный массив' n ' элементов
  2. выделяет память в памяти кучи процесса, как вы используете новая оператор для создания указателя
  3. возвращает допустимый адрес (если выделение памяти для требуемого размера, если доступно в момент выполнения данного оператора)

Он выделяет пространство в куче, равное целочисленному массиву размером 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];