Violation d'accès à l'emplacement de lecture / écriture

Description du problème

Lorsque le programme C / C ++ est en cours d'exécution, il affiche « Violation d'accès en position lecture / écriture ». Par exemple: l'exception de première chance à 0x00007FFF33515D43 (swscale-4.dll) (dans QTDemo0.exe): 0xC0000005: une violation d'accès s'est produite lors de la lecture de l'emplacement 0x0000000000000040.

comme le montre l'image:

cause

En règle générale, c'est parce que le code où l'exception se produit implique la lecture ou l'écriture de données, et le pointeur est utilisé lors de l'accès aux données, et le pointeur n'a pas été correctement initialisé, ce qui entraîne la mémoire pointée par NULL.

Solution

Tout d'abord, recherchez l'emplacement du code d'erreur, qui peut être connu à partir des informations de pile appelées lorsque Visual Studio exécute le programme;


Pour afficher la pile d'appels:

Méthode habituelle

1. Ajoutez un point d'arrêt dans le code du programme (à exécuter);

2. Exécutez le programme en mode "débogage";

3. Le programme se met en pause au point d'arrêt et vous pouvez afficher les informations de pile dans la colonne "pile d'appels" dans le coin inférieur droit de la fenêtre VS (sinon, vous pouvez la trouver dans la vue de la barre de menus VS pendant le débogage).

Méthode spéciale

1. Lorsqu'un "conflit d'accès se produit à l'emplacement de lecture / écriture", cliquez sur le bouton "interrompre" dans la fenêtre d'invite;

2. Le curseur se placera directement sur la dernière ligne de code exécutée dans le programme;

3. À ce stade, vous pouvez afficher la vue "pile d'appels" dans le coin inférieur droit du VS et trouver l'emplacement exact où le conflit d'accès se produit un par un en fonction du niveau d'appel.


Faites attention au message d'erreur lorsqu'une exception se produit, pour voir si le conflit d'accès se produit en "lecture" ou "écriture". Vous pouvez localiser avec précision la variable de pointeur qui a provoqué l'exception en fonction de cela et la valeur de la variable locale;


Dans cet exemple, l'invite est un conflit d'écriture, elle doit donc être affectée à un pointeur non autorisé.

Et l'instruction d'affectation de pointeur dans la pile d'appels est uniquement

*p = 123;

Il est approximativement déterminé que l'espace mémoire pointé par p ne peut pas être écrit.


Enfin, vérifiez si la variable du pointeur est NULL, ou si l'espace mémoire auquel elle fait référence est NULL, le pointeur peut être défini mais aucun espace mémoire approprié n'est alloué pour le pointeur (vous pouvez utiliser malloc, nouveau pour allouer de l'espace).


Vous pouvez vérifier que la valeur de «p» dans VS est 0. Évidemment, cela ne pointe pas vers une adresse mémoire légale, donc un conflit d'écriture se produit lorsque l'instruction d'affectation est exécutée!

À propos de moi


> Je suis un homme qui aime l' innovation, jeune optimiste
> passe - temps sont en train de lire, jouer au football, jouer LOL, etc.
> comme un ami de mon article, vous pouvez ajouter une lettre micro personnelle: `
CS-huo `
> en question peut explorer l'autre, apprendre ensemble !

Je suppose que tu aimes

Origine blog.csdn.net/gkzscs/article/details/51613595
conseillé
Classement