Что делает "новый int (100)"?
Возможный дубликат:
- это переменная или функция
Я ошибочно использовал что-то вроде:
int *arr = new int(100);
и он передает компиляцию, но я знал, что это неправильно. Это должно быть
int *arr = new int[100];
Что думает компилятор, когда я написал неверный?
Ответы
Ответ 1
Первая строка выделяет один int
и инициализирует его 100
. Подумайте о int(100)
как вызов конструктора.
Поскольку это скалярное распределение, попытка доступа к arr[1]
или для освобождения памяти с помощью delete[]
приведет к поведению undefined.
Ответ 2
Цитата из Wikipedia new (С++):
int *p_scalar = new int(5); //allocates an integer, set to 5. (same syntax as constructors)
int *p_array = new int[5]; //allocates an array of 5 adjacent integers. (undefined values)
Ответ 3
Он выделяет один объект типа int
и инициализирует его значением 100
.
Многие люди не знают, что вы можете передать инициализатор на new
, там определенная идиома, которая должна быть более широко известна, чтобы избежать использования memset
:
new int[100]();
Это будет выделение массива int
и нуль-инициализация его элементов.
Кроме того, вы не должны использовать версию массива new
. Когда-либо. Там std::vector
для этой цели.
Ответ 4
Первый создает одно новое целое число, инициализирует его значением 100 и возвращает указатель на него.
В C/С++ нет разницы между указателем на массив и указателем на одно значение (указатель на массив на самом деле является только указателем на его первый элемент). Таким образом, это допустимый способ создания массива с одним элементом.