Защищена ли неиспользуемая память в адресном пространстве процесса только наличием разрешения на чтение, так что запись в местоположение, указанное, например, указателем, унифицированным указателем, всегда приводит к тому, что ОС фиксирует ошибку страницы?Или это не тот случай, и каждой ячейке памяти, кроме кода (какой доступ предоставляется только для чтения), предоставляется доступ на запись?
Я спрашиваю об этом, потому что мой друг показывал мне свой код, где онне инициализировал указатель и записывал в память, указанную им, но его программа не работала с компилятором mingw gcc для окон, а всегда с Visual C ++, в Mac или Linux.
Я думаю, что ОС не защищает память для неиспользуемых областей, и происходит сбой, потому что в коде, сгенерированном mingw, значение случайного указателя указывало на некоторую используемую область, такую как стек, кучаили код, в то время как в других случаях это указывало на некоторую свободную область.Но если ОС действительно не защищает неиспользуемые области, не будут ли такие ошибки, такие как неинициализированные указатели, трудными для отладки?
Полагаю, именно поэтому рекомендуется всегда назначать NULL указателю после вызова delete
или free
, чтобы при обращении к нему что-то действительно вызывало видимый сбой.