Я ожидаю, что ошибка произойдет при ссылке на p1 и p2 после удаления p1; не так ли?
Не обязательно.
При этомточка, значение переменной-указателя не определено
Не определено, например, использование указателя после вызова delete
может привести к чему-либо: хорошему, плохому или нейтральному.
Компилятору не требуется устанавливать какие-либо барьеры времени выполнения для дальнейшего использования указателя.В частности, не требуется немедленно завершать программу.Конечно, хороший компилятор (с правильными настройками) может предупредить вас, если увидит, что ваш код повторно использует удаленные указатели.
В компиляторе Visual Studio C ++ ссылка на p2 выводит большое отрицательное число, указывая, что мыобращение к памяти, которая не принадлежит нам, и доступ к p1 вызывает сбой программы.
Определенный компилятор может создать процесс, который в конкретной операционной системе при определенных условиях загрузки памяти вызываетавария.Или не может.Точно так же не требуется, чтобы память, связанная с указателем, была заполнена мусорными данными.
В частности, я считаю, что Visual Studio в отладочной сборке может обрабатывать память указателя, так что дальнейшее использование приводит к сбою/ исключение.Это полезно для возможности отладки.
Помимо отладочных сборок, единственные проблемы, которые могут возникнуть, являются случайными.Рассмотрим следующие возможности для указателя, которому был вызван delete
и который затем используется повторно:
- Процесс освободил память для операционной системы.Ваша программа пытается получить доступ к памяти, к которой у нее нет прав.
SEGFAULT
(сбой). - Внутренне память помечена как принадлежащая другой переменной (т. Е. Какой-то другой части вашей программы с именем
new
или аналогичной) и была записана в нее.Возможно, он заполнен данными для мусора.Может возникнуть или не возникнуть проблема в зависимости от того, как ваша программа использует переменную.Может произойти сбой, распечатать искаженный текст и т. Д. - Внутренне память помечена как удаленная, но никакой другой части вашей программы это не требуется.На данный момент память осталась нетронутой.Предположительно, это то, что вы видели в clang.
Короче говоря, предсказать, что будет с памятью для удаленного указателя, сложно, единственная ответственность, которая дается программисту, такова: не использоватьэто снова.