Неопределенное поведение .
&arr[0]
- это тот же адрес памяти, на который arr
распадается . Значит, вы действительно звоните delete arr;
. Это неопределенное поведение , потому что вы используете delete
, когда вам нужно использовать delete[]
. Память, выделенная с помощью new
ДОЛЖНА , должна быть освобождена с помощью delete
. Память, выделенная с помощью new[]
ДОЛЖНА , должна быть освобождена с помощью delete[]
.
Но, давайте предположим, во время выполнения вашего компилятора достаточно информации в метаданных выделенного массива, чтобы освободить массив правильно. delete
При массиве освобождается весь массив. Вы не можете освободить отдельные элементы массива. И доступ к любому элементу массива после освобождения всего массива - это неопределенное поведение . Вы обращаетесь к arr[0]
после вызова delete arr;
для освобождения массива. Вы не выделяете новый массив для arr
, на который нужно указать. Вам повезло, что ваш код не просто взломал sh сразу.
Это определение неопределенного поведения - НИЧЕГО может произойти. Вы можете прочитать старую память, прежде чем она будет перезаписана. Вы могли читать из случайной памяти. Вы можете испортить память. Вы могли бы взломать sh.