Infracción de acceso en ubicación de lectura / escritura

Descripción del problema

Cuando el programa C / C ++ se está ejecutando, indica " Infracción de acceso en posición de lectura / escritura ". Por ejemplo: la primera excepción de oportunidad en 0x00007FFF33515D43 (swscale-4.dll) (en QTDemo0.exe): 0xC0000005: Se produjo una infracción de acceso al leer la ubicación 0x0000000000000040.

como muestra la imagen:

porque

Generalmente, se debe a que el código donde ocurre la excepción implica leer o escribir datos, y el puntero se usa al acceder a los datos y el puntero no se ha inicializado correctamente, lo que da como resultado la memoria apuntada por NULL.

Solución

Primero, busque la ubicación del código de error, que se puede conocer a partir de la información de la pila llamada cuando Visual Studio ejecuta el programa;


Para ver la pila de llamadas:

Método habitual

1. Agregue un punto de interrupción en el código del programa (a ejecutar);

2. Ejecute el programa en modo "depuración";

3. El programa se detendrá en el punto de interrupción. En este momento, puede ver la información de la pila en la columna "pila de llamadas" en la esquina inferior derecha de la ventana VS (si no, puede encontrarla en la vista de la barra de menú VS durante la depuración).

Método especial

1. Cuando se produzca un "conflicto de acceso en la ubicación de lectura / escritura", haga clic en el botón "interrumpir" en la ventana de solicitud;

2. El cursor se ubicará directamente en la última línea de código ejecutada en el programa;

3. En este momento, puede ver la vista "pila de llamadas" en la esquina inferior derecha del VS y encontrar la ubicación exacta donde ocurre el conflicto de acceso uno por uno según el nivel de llamada.


Preste atención al mensaje de error cuando ocurre una excepción, para ver si el conflicto de acceso ocurre en "lectura" o "escritura" Puede ubicar con precisión la variable de puntero que causó la excepción basándose en esto y el valor de la variable local;


En este ejemplo, el indicador es un conflicto de escritura, por lo que debe asignarse a un puntero ilegal.

Y la declaración de asignación de puntero en la pila de llamadas es solo

*p = 123;

Se determina aproximadamente que el espacio de memoria al que apunta p no se puede escribir.


Finalmente, verifique si la variable de puntero es NULL, o si el espacio de memoria al que se refiere es NULL, el puntero puede estar definido pero no se asigna un espacio de memoria adecuado para el puntero (puede usar malloc, new para asignar espacio).


Puede verificar que el valor de "p" en VS sea 0. Obviamente, no apunta a una dirección de memoria legal, por lo que se produce un conflicto de escritura cuando se ejecuta la instrucción de asignación.

sobre mí


> Soy un hombre que le gusta la innovación, joven y optimista
> aficiones son la lectura, jugar al fútbol, jugar LOL, etc.
> como un amigo de mi artículo, se puede añadir una letra micro personales: `
CS-Huo `
> en cuestión pueda ser explorado entre sí, aprender juntos !

Supongo que te gusta

Origin blog.csdn.net/gkzscs/article/details/51613595
Recomendado
Clasificación