Первая версия кода выделяет место для одного символа, это совершенно правильно, вы можете выделить одну вещь с помощью new
или массив вещей с помощью new[]
.Беда в том, что вы идете и топаете всю память, которой у вас нет , что является неопределенным поведением.
Ничего не происходит неправильно, когда вы вызываете delete
, вы удаляетедействительный, ранее выделенный указатель.Что может пойти не так, если вы изменяете память, которой не владеете.
Во втором случае вы выделяете 3 символа, и манипуляции действительны.
Обратите внимание, что в C ++ вам следуетиспользовать std::string
для строковых данных, std::vector
для переменной длины или std::array
для фиксированной длины.