Я новичок в C++, и у меня есть сомнения. Если у меня есть такой код:
int* f(int n){ //global
int* arr = new int[n];
for(int i=0;i<n;i++)
arr[i]=i;
return arr;
}
void main() {
int n;
scanf("%d",&n);
int* arr1 = new int; //or should I write just int* arr1; ?
arr1 = f(n);
delete [] arr1; // or just delete arr1;
}
Вопрос в том, должен ли я удалить arr1 как массив или нет, так как я объявил его как указатель на int? Код не имеет большого смысла, но он хорош в качестве примера. Я знаю, что есть много подобных вопросов, но я не смог найти точный ответ на мой вопрос.
Если выделение было выполнено с помощью new <type>[n]
то освобождение должно быть выполнено с помощью delete []
.
Все, что имеет значение при определении правильной формы delete
- это форма new
которая использовалась при распределении.
В вашей main
функции вы просачиваете память. Вы инициализируете arr1
вызовом new
а затем сразу же перезаписываете это значение новым указателем, возвращаемым вызовом f()
. Звонок на new
с main
просто неверен и должен быть удален. Напишите это просто так:
int* arr1 = f(n);
И ваш main
должен быть
int main()
Написать
int* arr1 = f(n);
и позже
delete[] arr1;
объект массива выделяется в f()
, а delete
удаляет его. Сам указатель не может быть удален, только объект (массив), на который он указывает.
std::vector<int>
.