Compartilhar via


Classe System.AccessViolationException

Este artigo fornece comentários 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 por meio 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. Identifica AccessViolationException claramente esses 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 no código verificável gera uma NullReferenceException exceção. Ocorre AccessViolationException apenas quando o código gerenciado verificável interage com código não gerenciado ou com código gerenciado que não é seguro.

Solução de problemas para exceções de “AccessViolationException”

Uma AccessViolationException exceção só pode ocorrer 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 exceção AccessViolationException , dependendo da plataforma.
  • Uma violação de acesso no código não gerenciado que é propagada para o código gerenciado é sempre encapsulada em uma exceção AccessViolationException.

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

  • Verifique se a memória que você está tentando acessar foi alocada. Uma AccessViolationException exceção é sempre gerada por uma tentativa de acessar a memória protegida, ou seja, para acessar a memória que não é alocada ou que não pertence a um processo.

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

  • Verifique se a memória que você está tentando acessar não foi corrompida. Se várias operações de leitura ou gravação tiverem ocorrido por meio de ponteiros incorretos, a memória poderá 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 pelo runtime do .NET não são tratadas pela catch instrução em um manipulador de exceção estruturado se a exceção ocorrer fora da memória reservada pelo runtime.

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

Cuidado

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