Classe System.AccessViolationException
Este artigo fornece observações complementares à documentação de referência para essa API.
Uma violação de acesso ocorre em código não gerenciado ou inseguro quando tenta ler ou gravar na memória que não foi alocada ou para a qual não tem acesso. Isso geralmente ocorre porque um ponteiro tem um valor ruim. Nem todas as leituras ou gravações por ponteiros incorretos resultam em violações de acesso, de modo que uma violação de acesso geralmente indica que várias leituras ou gravações ocorreram por ponteiros incorretos, e que a memória pode estar corrompida. Portanto,as violações de acesso quase sempre indicam erros graves de programação. Um AccessViolationException identifica claramente esses erros graves.
Em programas que consistem inteiramente de código gerenciado verificável, todas as referências são válidas ou nulas, e violações de acesso são impossíveis. Qualquer operação que tente referenciar uma referência nula no código verificável gera uma exceção NullReferenceException. Um AccessViolationException ocorre somente quando o código gerenciado verificável interage com código não gerenciado ou com código gerenciado não seguro.
Solucionar problemas de exceções de AccessViolationException
Uma exceção AccessViolationException só pode ocorrer em código gerenciado inseguro 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 inseguro pode ser expressa como uma exceção NullReferenceException ou uma exceção AccessViolationException, dependendo da plataforma.
- Uma violação de acesso em código não gerenciado que o transforma em um código gerenciado é sempre envolvida em uma exceção AccessViolationException.
Em ambos os casos, você pode identificar e corrigir a causa da exceção AccessViolationException da seguinte maneira:
Certifique se que a memória que você está tentando acessar tenha sido alocada. Uma exceção AccessViolationException é 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 são fornecidos pelo runtime .NET. Se o código gerenciado fornecer a mesma funcionalidade que seu código não gerenciado, talvez você queira mover 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 você está tentando acessar não foi corrompida. Se várias operações de leitura ou gravação ocorreram por meio de ponteiros incorretos, a memória pode estar corrompida. Isso geralmente ocorre ao fazer leitura ou gravação em endereços fora de um buffer predefinido.
AccessViolationException e blocos try/catch
As exceções AccessViolationException lançadas pelo runtime .NET não serão identificadas pela instrução catch
em um manipulador de exceções estruturadas se a exceção ocorrer fora da memória reservada pelo runtime. Para identificar essa exceção AccessViolationException, aplique o atributo HandleProcessCorruptedStateExceptionsAttribute 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
.