C ++ не отслеживает память для вас. Это не знает, это не волнует. Это зависит от вас: программист. (Де) распределение - это запрос к базовой ОС. Или, точнее, это вызов libc ++ (или, возможно, какой-то другой lib), который может или не может получить доступ к ОС, то есть деталь реализации. В любом случае ОС (или другая библиотека) отслеживает, какие части памяти вам доступны.
Когда вы пытаетесь получить доступ к памяти, которую ОС не назначала вам, ОС выдает ошибку segfault ( технически он поднимается процессором , предполагая, что он поддерживает защиту памяти, это немного сложно). И это хорошая ситуация. Таким образом, ОС говорит вам: эй, в вашем коде есть ошибка. Обратите внимание, что ОС не имеет значения, используете ли вы C ++, C, Rust или что-то еще. С точки зрения операционной системы все является машинным кодом.
Однако, что хуже, даже после delete
память все еще может принадлежать вашему процессу (помните те библиотеки, которые отслеживают память?). Таким образом, доступ к такому указателю является неопределенным поведением, может произойти все что угодно, включая правильное выполнение кода (поэтому часто бывает трудно найти такие ошибки).
Если он просто превращает его в произвольный двоичный мусор числа, разве я не буду просто читать это число мусора, когда разыменую указатель?
Кто сказал, что это превращается в мусор? Что на самом деле происходит с основной памятью (независимо от того, исправляет ли ее операционная система, или она заполнена нулями, или каким-то мусором, или, может быть, ничем), вас не волнует. Все, что вам нужно знать, это то, что после delete
использование указателя больше не безопасно. Даже (или особенно), когда все выглядит хорошо.