Удаление динамически размещаемого массива

0

Я новичок в 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? Код не имеет большого смысла, но он хорош в качестве примера. Я знаю, что есть много подобных вопросов, но я не смог найти точный ответ на мой вопрос.

  • 2
    Ни. Вы должны использовать std::vector<int> .
  • 0
    Я знаю, но мой профессор просит использовать указатели в начале.
Показать ещё 1 комментарий
Теги:
arrays
pointers
delete-operator

2 ответа

2
Лучший ответ

Если выделение было выполнено с помощью new <type>[n] то освобождение должно быть выполнено с помощью delete [].

Все, что имеет значение при определении правильной формы delete - это форма new которая использовалась при распределении.

В вашей main функции вы просачиваете память. Вы инициализируете arr1 вызовом new а затем сразу же перезаписываете это значение новым указателем, возвращаемым вызовом f(). Звонок на new с main просто неверен и должен быть удален. Напишите это просто так:

int* arr1 = f(n);

И ваш main должен быть

int main()
  • 0
    Так что я должен использовать delete arr1, потому что я выделил arr1 с новым (не новым [])?
  • 0
    Вы выделили arr1 с новым []
Показать ещё 4 комментария
1

Написать

int* arr1 = f(n);

и позже

delete[] arr1;

объект массива выделяется в f(), а delete удаляет его. Сам указатель не может быть удален, только объект (массив), на который он указывает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню