В большинстве операционных систем, ориентированных на аппаратное обеспечение с MMU (например, x86), единственный способ фактически получить ошибку при чтении из памяти - это если адрес приложения не отображается.Так как MMU не имеет записи, которая сообщает ему, где найти в физической памяти данные, связанные с логическим адресом, который запрашивает приложение, это вызывает прерывание, и операционная система вступает во владение, чтобы что-то с этим сделать.
Но большинство операционных систем мало что делают для управления памятью от имени приложения, за исключением предоставления ему непрерывного куска памяти нужного размера.Операционная система также не позволяет приложениям работать в MMU, так как большинство MMU не достаточно умны, чтобы приложения могли безопасно выполнять свои действия, не оказывая негативного влияния на другие программы (случайно или по злому умыслу).
Таким образом, когда вы malloc()
что-то, если ваше приложение еще не может поместить это в существующее адресное пространство, оно запрашивает у операционной системы больше, но когда вы позже free()
это,если это не произойдет в самом конце адресного пространства вашего приложения, вы не сможете вернуть его операционной системе, чтобы эта область памяти вызывала ошибку при попытке ее прочитать.
ТамЕсть несколько способов получить это, например, с помощью mmap()
, но это не совсем правильная причина для использования этой функции.