#массивы #cpp
Здравствуйте. :) Вот такой вопрос возник, почему вот этот после выполнения int *x = new int[2]; delete x; идентичен вот этому int *x = new int[2]; delete []x; Везде где читал, сказано что массив нужно удалять вторым способом.
Ответы
Ответ 1
Если вы выделяли память при помощи new[], вы обязаны освободить её с помощью delete[]. Так гласит стандарт. Освобождение такой памяти как-то по-другому (delete без [] или вообще free) является Undefined Behaviour. Если в программе есть Undefined Behaviour, она имеет право вести себя как угодно: может ничего плохого не делать, может вылететь в любой точке, отформатировать ваш винчестер или выбросить из окна вашего кота. You have been warned.Ответ 2
Если Вы выделили массив элементов, то этот массив и нужно удалить. New делает malloc на sizeof(объект) и вызывает конструктор объекта, new[] делает malloc на sizeof(объект) * кол-во_объектов, вызывает конструкторы для каждого будущего объекта и записывает информацию о том, память для скольких объектов была выделена. Куда и как эта информация записывается вопрос отдельный (плюс бывает ситуации когда это информация не нужна). Вызывая delete Вы говорите компилятору "удали этот один элемент по такому-то адресу". Оператор delete[] же читает сколько объектов расположено в выделенной памяти (как мы помним, оператор new[] сохранил это число в процессе своей работы), вызывает для каждого их них деструктор, а после вызывает free(), "отдавая память назад ОС". Именно поэтому для памяти, выделенной через new/new[] нужно вызывать delete/delete[] соответственно. Контроль за тем, что для оператора выделения должен быть вызван соответствующий оператор освобождения лежит на программисте.Ответ 3
x - указатель на первый елемент массива, поетому delete x; удаляет только первый елемент.Ответ 4
Оператор удаления массива называется delete[], а не delete []. В выражении delete []x, []x - это что за операция? []x - нет такой операции !
Комментариев нет:
Отправить комментарий