Здравствуйте. :)
Вот такой вопрос возник, почему вот этот после выполнения
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; удаляет только первый елемент.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей