Это должно происходить?
Здесь не должно происходить ничего "предполагаемого" или, скорее, "ожидаемого" - вы вызываете неопределенное поведение, поэтому все, что может случается, включая «ничего».
вызов функции m.msg () в main () все еще может получить к нему доступ без сегмента!
Это не ужасноУдивительно (но опять же, ни на что не стоит рассчитывать).Освобождение памяти более или менее говорит ОС, что эта память может быть свободно использована / перезаписана.Чем больше внимания уделяется скорости над безопасностью между вашим компилятором, ОС и их настройками, тем меньше усилий они потратят на то, чтобы пометить эту память как недоступную, и, поскольку вы просто использовали именно эту область памяти, вам пришлось бы выполнять очень строгие проверки ОС.чтобы даже получить segfault там.Кроме того, крайне маловероятно, что этот 13-й символ будет перезаписан во время между двумя вызовами msg()
, поэтому вы, вероятно, снова будете читать то же самое.
Но все это относится только к этому небольшому примеруи, опять же, не на что полагаться.Неопределенное поведение (в некоторой степени, к сожалению) не означает автоматически, что ваша программа будет работать с ошибками сейчас.Это может произойти, или может произойти ошибка по прошествии двух минут в совершенно другой части, либо вывести на экран неверные результаты, либо отформатировать жесткий диск.Или это может работать так, как вы и планировали, на этот раз.