La respuesta aceptada no cuenta la historia completa.
Sí, siempre que vea ceros, un puntero NULL
está involucrado. Eso es porque NULL
es por definición cero. Así que llamar a cero NULL
puede no decir mucho.
Qué es interesante acerca del mensaje que aparece es el hecho de que NULL
se menciona dos veces . De hecho, el mensaje que informa se parece un poco a los mensajes que los sistemas operativos de la marca Windows muestran al usuario.
El mensaje dice la dirección NULL
trataron de leer NULL
. ¿Entonces que significa eso? Específicamente, ¿cómo se lee una dirección?
Normalmente pensamos en las instrucciones de una dirección de lectura y escritura de la memoria en ciertas direcciones. Sabiendo eso nos permite analizar el mensaje de error. El mensaje está tratando de articular que la instrucción en direcciónNULL
intentó leerNULL
.
Por supuesto, no hay instrucciones en la dirección NULL
, es por eso que consideramos NULL
como especiales en nuestro código. Pero se puede pensar que cada instrucción comienza con el intento de leerse a sí mismo. Si el registro de las CPU EIP
está en la dirección NULL
, la CPU intentará leer el código de operación para obtener una instrucción de la dirección 0x00000000 (NULL
). Este intento de leer NULL
fallará y generará el mensaje que ha recibido.
En el depurador, observe que EIP
es igual a 0x00000000 cuando recibe este mensaje. Esto confirma la descripción que te he dado.
La pregunta entonces es: "¿Por qué mi programa intenta ejecutar la dirección NULL
?"Hay tres posibilidades que vienen a la mente:.
- Tienes intento de hacer una llamada de función a través de un puntero de función que se ha declarado, asignado a
NULL
, no inicializado contrario, y están dereferencing
- Del mismo modo, puede estar llamando a un método C++ "abstracto" que tiene una entrada
NULL
en el vtable del objeto. Estos se crean en su código con la sintaxis virtual function_name()=0
.
- En su código, un buffer de pila se ha desbordado al escribir ceros. se han escrito más allá del final del almacenamiento intermedio de la pila, sobre la dirección de retorno conservada. Cuando la función más tarde ejecuta su
ret
instrucción, el valor 0x00000000 (NULL
) se carga desde el punto de memoria sobrescrita. Este tipo de error, desbordamiento de pila, es el epónimo de nuestro foro.
Puesto que usted menciona que usted está llamando a una biblioteca de terceros, voy a señalar que puede ser una situación de la biblioteca esperando que proporcione un puntero no NULL
función como entrada a algunos API. A veces se conocen como funciones de "devolución de llamada".
Deberá utilizar el depurador para reducir aún más la causa de su problema, pero las posibilidades anteriores le ayudarán a resolver el enigma.
Eso me recuerda a bajo Turbo C, "Asignación de puntero nulo" cuando se maneja de manera incorrecta ... – t0mm13b
¿Es reproducible? De lo contrario, agregue una herramienta como madExcept y espere informes de error, use el depurador y observe el rastreo de la pila. –
Esto es de los días anteriores de Turbo C, debajo del depurador, agregue un reloj a la variable puntero apuntando a la ubicación 0, la línea recién ejecutada al entrar en ella, que provocó que la variable apuntando a la ubicación 0 cambie el valor es la línea que hecho un desastre. Principalmente un error de puntero ... – t0mm13b