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


Класс System.AccessViolationException

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

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

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

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

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

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

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

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

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

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

AccessViolationException и блоки try/catch

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

Только .NET Framework: чтобы обработать такое AccessViolationException исключение, примените HandleProcessCorruptedStateExceptionsAttribute атрибут к методу, в котором создается исключение. Это изменение не влияет на AccessViolationException исключения, создаваемые пользовательским кодом, которые по-прежнему могут быть перехвачены оператором catch.

Осторожность

Атрибут HandleProcessCorruptedStateExceptions устарел в текущих версиях .NET. Восстановление из поврежденного состояния процесса— исключений не поддерживается, а атрибут, если он присутствует, игнорируется.