System.AccessViolationException classe

Observação

Este artigo fornece observações complementares à documentação de referência para esta API.

Uma violação de acesso ocorre em código não gerenciado ou não seguro quando o código tenta ler ou gravar na memória que não foi alocada ou à qual não tem acesso. Isso geralmente ocorre porque um ponteiro tem um valor incorreto. Nem todas as leituras ou gravações através de ponteiros incorretos levam a violações de acesso, portanto, uma violação de acesso geralmente indica que várias leituras ou gravações ocorreram por meio de ponteiros incorretos e que a memória pode estar corrompida. Assim, as violações de acesso quase sempre indicam erros graves de programação. Um AccessViolationException identifica claramente estes erros graves.

Em programas que consistem inteiramente em código gerenciado verificável, todas as referências são válidas ou nulas, e as violações de acesso são impossíveis. Qualquer operação que tente fazer referência a uma referência nula em código verificável gera uma NullReferenceException exceção. Um AccessViolationException ocorre somente quando o código gerenciado verificável interage com código não gerenciado ou com código gerenciado inseguro.

Solucionar problemas de exceções AccessViolationException

Uma AccessViolationException exceção pode ocorrer somente em código gerenciado não seguro ou quando o código gerenciado verificável interage com código não gerenciado:

  • Uma violação de acesso que ocorre em código gerenciado não seguro pode ser expressa como uma NullReferenceException exceção ou uma AccessViolationException exceção, dependendo da plataforma.
  • Uma violação de acesso no código não gerenciado que sobe até o código gerenciado é sempre encapsulada em uma exceção de AccessViolationException.

Em ambos os casos, você pode identificar e corrigir a AccessViolationException causa da exceção da seguinte maneira:

  • Certifique-se de que a memória que está a tentar aceder está alocada. Uma AccessViolationException exceção é sempre lançada por uma tentativa de acessar a memória protegida, ou seja, acessar a memória que não está alocada ou que não pertence a um processo.

    O gerenciamento automático de memória é um dos serviços que o tempo de execução do .NET fornece. Se o código gerenciado fornecer a mesma funcionalidade que seu código não gerenciado, considere mudar para o código gerenciado para aproveitar essa funcionalidade. Para obter mais informações, consulte Gerenciamento automático de memória.

  • Certifique-se de que a memória que está a tentar aceder não foi corrompida. Se várias operações de leitura ou gravação tiverem ocorrido através de ponteiros incorretos, a memória pode estar corrompida. Isso normalmente ocorre ao ler ou gravar em endereços fora de um buffer predefinido.

AccessViolationException e blocos try/catch

AccessViolationException as exceções geradas pela máquina virtual .NET não são tratadas pela instrução catch num manipulador de exceções estruturado se a exceção ocorrer fora da memória reservada pela máquina virtual.

Somente .NET Framework: para lidar com essa AccessViolationException exceção, aplique o HandleProcessCorruptedStateExceptionsAttribute atributo ao método no qual a exceção é lançada. Essa alteração não afeta as exceções AccessViolationException lançadas pelo código do usuário, que podem continuar a ser capturadas por uma instrução catch.

Atenção

O atributo HandleProcessCorruptedStateExceptions está obsoleto nas versões atuais do .NET. Não há suporte para recuperação do estado corrompido do processo – exceções não são suportadas e o atributo, se presente, é ignorado.