Поделиться через


Класс System.AccessViolationException

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Нарушение доступа возникает в неуправляемом или небезопасном коде, когда код пытается считывать или записывать в память, не выделенную или к которой у него нет доступа. Обычно это происходит, так как указатель имеет плохое значение. Не все операции чтения или записи по неправильным указателям приводят к нарушениям прав доступа, поэтому нарушение прав доступа обычно указывает, что таких операций было несколько и что память может быть повреждена. Таким образом, нарушения доступа почти всегда указывают на серьезные ошибки программирования. Четко AccessViolationException идентифицирует эти серьезные ошибки.

В программах, состоящих полностью из проверяемого управляемого кода, все ссылки являются допустимыми или пустыми, а нарушения доступа являются невозможными. Любая операция, которая пытается ссылаться на пустую ссылку в проверяемом NullReferenceException коде, вызывает исключение. Возникает AccessViolationException только в том случае, если проверяемый управляемый код взаимодействует с неуправляемым кодом или небезопасным управляемым кодом.

Устранение неполадок исключений AccessViolationException

Исключение AccessViolationException может возникать только в небезопасном управляемом коде или при проверке управляемого кода, взаимодействующего с неуправляемым кодом:

  • Нарушение доступа, возникающее в небезопасном управляемом коде, может быть выражено как NullReferenceException исключение или AccessViolationException исключение в зависимости от платформы.
  • Нарушение доступа в неуправляемом коде, которое пузырьков до управляемого кода всегда упаковывается в AccessViolationException исключение.

В любом случае можно определить и исправить причину AccessViolationException исключения следующим образом:

  • Убедитесь, что память, которую вы пытаетесь получить доступ, была выделена. AccessViolationException Исключение всегда создается попыткой доступа к защищенной памяти, то есть для доступа к памяти, которая не выделена или не принадлежит процессу.

    Автоматическое управление памятью — это одна из служб, предоставляемых средой выполнения .NET. Если управляемый код предоставляет те же функции, что и неуправляемый код, вы можете перейти к управляемому коду, чтобы воспользоваться преимуществами этой функции. Для получения дополнительной информации см. Automatic Memory Management.

  • Убедитесь, что память, которую вы пытаетесь получить доступ, не повреждена. Если несколько операций чтения или записи произошли через плохие указатели, память может быть повреждена. Обычно это происходит при чтении или записи адресов за пределами предопределенного буфера.

AccessViolationException и блоки try/catch

AccessViolationException Исключения, создаваемые средой выполнения .NET, не обрабатываются catch инструкцией в структурированном обработчике исключений, если исключение возникает за пределами памяти, зарезервированной средой выполнения. Чтобы обработать такое AccessViolationException исключение, примените HandleProcessCorruptedStateExceptionsAttribute атрибут к методу, в котором создается исключение. Это изменение не влияет на AccessViolationException исключения, создаваемые пользовательским кодом, который может продолжать перехватывать оператором catch .