Comment puis-je déboguer une Violation d’accès de C++ ?How Can I Debug a C++ Access Violation?

Description du problèmeProblem Description

Mon programme provoque une violation d'accès.My program produces an access violation. Comment puis-je corriger cette erreur ?How can I debug this?

SolutionSolution

Si vous obtenez une violation d’accès sur une ligne de code qui déréférence plusieurs pointeurs, il peut être difficile de trouver le pointeur à l’origine de la violation d’accès.If you get an access violation on a line of code that dereferences multiple pointers, it can be difficult to find out which pointer caused the access violation. À compter de Visual Studio 2015 Update 1, la boîte de dialogue d’exception nomme désormais de manière explicite le pointeur à l’origine de la violation d’accès.Starting in Visual Studio 2015 Update 1, the exception dialog box now explicitly names the pointer that caused the access violation.

Par exemple, le code suivant doit générer une violation d’accès :For example, given the following code, you should get an access violation:

#include <iostream>  
using namespace std;  

class ClassB {  
public:  
        ClassC* C;  
        ClassB() {  
                C = new ClassC();  
        }  
     void printHello() {  
                cout << "hello world";  
        }  
};  

class ClassA {  
public:  
    ClassB* B;  
      ClassA() {  
                B = nullptr;  
        }  
};  

int main() {  
    ClassA* A = new ClassA();  
      A->B->printHello();  
}  

Si vous exécutez ce code dans Visual Studio 2015 Update 1, la boîte de dialogue d’exception suivante doit s’afficher :If you run this code in Visual Studio 2015 Update 1, you should see the following exception dialog:

AccessViolationCPlusAccessViolationCPlus

Si vous n’arrivez pas à déterminer la raison pour laquelle le pointeur a provoqué une violation d’accès, tracez le code pour vérifier que le pointeur à l’origine du problème a été correctement assigné.If you cannot determine why the pointer caused an access violation, trace through the code to make sure that the pointer causing the problem has been assigned correctly. S’il est passé en tant que paramètre, assurez-vous qu’il est passé correctement, et vous n’êtes pas accidentellement créée une superficiellement copie.If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Vérifiez que les valeurs ne sont pas en cours involontairement modifiées quelque part dans le programme en créant un point d’arrêt pour le pointeur en question pour vous assurer qu’il n’est pas en cours de modification ailleurs dans le programme.Then verify that the values are not being unintentionally changed somewhere in the program by creating a Data Breakpoint for the pointer in question to make sure it isn't being modified elsewhere in the program. Pour plus d’informations sur les points d’arrêt sur variable, consultez la section consacrée à ce sujet dans Using Breakpoints.For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.

Voir aussiSee Also

Forum Aux Questions sur le débogage du code natifDebugging Native Code FAQs