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