Теперь попробуйте с заполнением массив строк 100 байт каждый, и посмотреть, если он по-прежнему освобождает всю выделенную память ...
Это неопределенное поведение, и, как всегда, иногда UB появится работать. В вашем случае у вас нет деструктора для объектов в памяти, поэтому нет «дальнейшей работы», просто освободите всю память [1]. Но если у вас есть объект, который имеет деструктор, который делает что-то полезное, он (вероятно) не будет вызван.
Вы должны ВСЕГДА использовать delete []
, если вы использовали new T[size];
для выделения. Не смешивайте эти два, это всегда неправильно - иногда он ПРОИСХОДИТ работать [так же, как НЕКОТОРЫЕ размеры гаечных ключей в дюймах работают на миллиметровых гайках и наоборот - но по-прежнему неправильно использовать гаечный ключ на метрических гайках].
[1] Обратите внимание, что это может работать для этой конкретной комбинации компилятора/библиотеки C++. Компиляция с другим компилятором, использование другой библиотеки C++ или компиляция для другой ОС может привести к ее сбою при попытке выполнить одно и то же.
AFAIK это UB. – Borgleader
«Почему это работает?» - это не так, похоже, работает. –
Без скобок вы вызываете только один деструктор, а не все деструкторы в массиве. Также см. Http://stackoverflow.com/questions/2425728/delete-vs-delete-operators-in-c – GreatBigBore