Оператор delete: удаление массива

196
19 декабря 2016, 19:47

Здравствуйте. :)
Вот такой вопрос возник, почему вот этот после выполнения

int *x = new int[2];  delete x;

идентичен вот этому

int *x = new int[2];  delete []x;

Везде где читал, сказано что массив нужно удалять вторым способом.

Answer 1

Если вы выделяли память при помощи new[], вы обязаны освободить её с помощью delete[]. Так гласит стандарт.

Освобождение такой памяти как-то по-другому (delete без [] или вообще free) является Undefined Behaviour. Если в программе есть Undefined Behaviour, она имеет право вести себя как угодно: может ничего плохого не делать, может вылететь в любой точке, отформатировать ваш винчестер или выбросить из окна вашего кота.

You have been warned.

Answer 2

Если Вы выделили массив элементов, то этот массив и нужно удалить. New делает malloc на sizeof(объект) и вызывает конструктор объекта, new[] делает malloc на sizeof(объект) * кол-во_объектов, вызывает конструкторы для каждого будущего объекта и записывает информацию о том, память для скольких объектов была выделена. Куда и как эта информация записывается вопрос отдельный (плюс бывает ситуации когда это информация не нужна).

Вызывая delete Вы говорите компилятору "удали этот один элемент по такому-то адресу". Оператор delete[] же читает сколько объектов расположено в выделенной памяти (как мы помним, оператор new[] сохранил это число в процессе своей работы), вызывает для каждого их них деструктор, а после вызывает free(), "отдавая память назад ОС". Именно поэтому для памяти, выделенной через new/new[] нужно вызывать delete/delete[] соответственно. Контроль за тем, что для оператора выделения должен быть вызван соответствующий оператор освобождения лежит на программисте.

Answer 3

x - указатель на первый елемент массива, поетому delete x; удаляет только первый елемент.

READ ALSO
OpenGl: Некорректное отображение квадратов

OpenGl: Некорректное отображение квадратов

ЗдравствуйтеЕсть программа, которая ищет ромбы в множестве заданных точек и выводит на экран координаты и площадь самого большого из них

183
Работа с файлами и структурами. Удалить запись по ее номеру.

Работа с файлами и структурами. Удалить запись по ее номеру.

Здравствуйте, не знаю как удалить элемент по заданному номеруМы создаем бинарный файл, в консоль заполняем структуру и она записывается...

293
Вопрос по циклам

Вопрос по циклам

Привет, ребят! У меня вопросПочему в коде ниже place_number в конце равен коду последнего символа?

229
Что такое pair и где использовать?

Что такое pair и где использовать?

Не могу понять зачем такое объединение двух объектов разного или одного типа, в один объект? И чем это отличается от map? И как или какой смысл...

225