Classe System.AccessViolationException

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

Une violation d’accès se produit dans du code non managé ou unsafe lorsque le code essaie de lire ou d’écrire dans une mémoire qui n’a pas été allouée, ou à laquelle il n’a pas accès. Cela se produit généralement à cause d’une valeur incorrecte du pointeur. Toutes les opérations de lecture ou d'écriture avec des pointeurs erronés ne provoquent pas des violations d'accès, une violation d'accès indique donc habituellement que plusieurs opérations de lecture ou d'écriture ont été exécutées par le biais de pointeurs erronés et que cette mémoire est peut-être endommagée. Les violations d’accès indiquent ainsi presque toujours de graves erreurs de programmation. Un AccessViolationException identifie de façon claire ces erreurs graves.

Dans des programmes composés entièrement de code managé vérifiable, toutes les références sont valides ou nul, ce qui empêche la possibilité de violations d’accès. Toute opération qui tente de référencer une référence nul dans du code vérifiable lève une exception NullReferenceException. Un événement AccessViolationException survient uniquement lorsque le code managé vérifiable interagit avec du code non managé ou avec du code managé non sécurisé.

Résoudre les problèmes d’exceptions AccessViolationException

Une exception AccessViolationException ne peut se produire que dans du code managé non sécurisé ou lorsque le code managé vérifiable interagit avec du code non managé :

  • Une violation d’accès qui se produit dans du code managé non sécurisé peut être exprimée sous la forme d’une exception NullReferenceException ou d’une exception AccessViolationException, selon la plateforme.
  • Une violation d’accès dans du code non managé qui crée des bulles vers le code managé est toujours encapsulée dans une exception AccessViolationException.

Dans les deux cas, vous pouvez identifier et corriger la cause de l’exception AccessViolationException de la manière suivante :

  • Assurez-vous que la mémoire à laquelle vous tentez d’accéder a été allouée. Une exception AccessViolationException est toujours levée par une tentative d’accès à la mémoire protégée. Autrement dit, pour accéder à la mémoire qui n’est pas allouée ou qui n’appartient pas à un processus.

    La gestion automatique de la mémoire est un des services fournis par le runtime .NET. Si un code managé fournit la même fonctionnalité que votre code non managé, vous pouvez passer au code managé pour tirer parti de cette fonctionnalité. Pour plus d'informations, consultez Automatic Memory Management.

  • Assurez-vous que la mémoire à laquelle vous tentez d’accéder n’a pas été altérée. Si plusieurs opérations de lecture et d’écriture ont été effectuées au moyen de pointeurs erronés, la mémoire peut être altérée. Cela se produit généralement lors de la lecture ou de l’écriture dans des adresses en dehors d’une mémoire tampon prédéfinie.

AccessViolationException et try/catch (blocs)

Les exceptions AccessViolationException levées par le runtime .NET ne sont pas gérées par l’instruction catch dans un gestionnaire d’exceptions structurées, si l’exception se produit en dehors de la mémoire réservée par le runtime. Pour gérer une telle exception AccessViolationException, appliquez l’attribut HandleProcessCorruptedStateExceptionsAttribute à la méthode dans laquelle l’exception est levée. Cette modification n’affecte pas les exceptions AccessViolationException levées par le code utilisateur. Elles peuvent continuer à être interceptées par une instruction catch.