Clase System.AccessViolationException

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

Se produce una infracción de acceso en código no administrado o no seguro cuando este intenta leer o escribir en memoria que no se ha asignado o a la que no tiene acceso. Esto suele ocurrir porque un puntero tiene un valor incorrecto. No todas las lecturas o escrituras con punteros no válidos llevan a infracciones de acceso; por lo tanto, una infracción de acceso suele indicar que se han realizado varias lecturas o escrituras con punteros no válidos y se ha dañado la memoria. Por lo tanto, las infracciones de acceso casi siempre indican errores de programación graves. Un objeto AccessViolationException identifica claramente estos errores graves.

En los programas que constan completamente de código administrado verificable, todas las referencias son válidas o nulas, y las infracciones de acceso son imposibles. Cualquier operación que intente hacer referencia a una referencia nula en el código verificable produce una excepción NullReferenceException. Un AccessViolationException se produce solo cuando el código administrado verificable interactúa con código no administrado o con código administrado no seguro.

Solución de problemas de las excepciones AccessViolationException

Una excepción AccessViolationException solo puede producirse en código administrado no seguro o cuando el código administrado verificable interactúe con código no administrado:

En cualquier caso, puede identificar y corregir la causa de la excepción AccessViolationException de la siguiente manera:

  • Asegúrese de que la memoria a la que intenta obtener acceso se haya asignado. Una excepción AccessViolationException siempre se produce por un intento de acceder a la memoria protegida, es decir, de acceder a la memoria que no está asignada o que no es propiedad de un proceso.

    La administración automática de la memoria es uno de los servicios que proporciona el runtime de .NET. Si el código administrado proporciona la misma funcionalidad que el código no administrado, puede que quiera pasar al código administrado para aprovechar esta funcionalidad. Para obtener más información, consulta Automatic Memory Management.

  • Asegúrese de que la memoria a la que intenta obtener acceso no esté dañada. Si se han realizado varias operaciones de lectura o escritura con punteros no válidos, es posible que la memoria esté dañada. Esto suele ocurrir al leer o escribir en direcciones fuera de un búfer predefinido.

Bloques AccessViolationException and try/catch blocks

Las excepciones AccessViolationException producidas por el entorno de ejecución de .NET no se controlan mediante la instrucción catch en un controlador de excepciones estructurado si la excepción se produce fuera de la memoria reservada por el runtime. Para controlar esta excepción AccessViolationException, aplique el atributo HandleProcessCorruptedStateExceptionsAttribute al método en el que se produce la excepción. Este cambio no afecta a las excepciones AccessViolationException producidas por el código de usuario, lo que puede seguir siendo detectado por una instrucción catch.