Compartir a través de


Comprobación de errores 0x18: REFERENCE_BY_POINTER

La comprobación de errores REFERENCE_BY_POINTER tiene un valor de 0x00000018. Esto indica que el recuento de referencias de un objeto no es válido para el estado actual del objeto.

Importante

Este artículo va dirigido a programadores. Si es un cliente que ha recibido un código de error de pantalla azul mientras usa el equipo, consulte Solución de errores de pantalla azul.

Parámetros de REFERENCE_BY_POINTER

Parámetro Descripción

1

Tipo del objeto cuyo recuento de referencias se está reduciendo.

2

Objeto cuyo recuento de referencias se está reduciendo.

3

Reserved

4

Reserved

Causa

El recuento de referencias de un objeto no es válido para el estado actual del objeto. Cada vez que un controlador usa un puntero a un objeto, el controlador llama a una rutina de kernel para aumentar el recuento de referencias del objeto en uno. Cuando el controlador se realiza con el puntero, el controlador llama a otra rutina de kernel para reducir el recuento de referencias en uno.

Los controladores deben coincidir con las llamadas a las rutinas que aumentan (referencia) y reducen (desreferencia) el recuento de referencias. Esta comprobación de errores se debe a una incoherencia en el recuento de referencias del objeto. Normalmente, la incoherencia se debe a un controlador que reduce el recuento de referencias de un objeto demasiadas veces, realizando llamadas adicionales que desreferencian el objeto. Esta comprobación de errores puede producirse porque el recuento de referencias de un objeto llega a cero mientras todavía hay identificadores abiertos para el objeto. También puede ocurrir cuando el recuento de referencias del objeto cae por debajo de cero, independientemente de si hay o no identificadores abiertos para el objeto.

Solución

Asegúrese de que el controlador coincide con las llamadas a las rutinas que aumentan y reducen el recuento de referencias del objeto. Asegúrese de que el controlador no realiza llamadas adicionales a rutinas que desreferencian el objeto (consulte el Parámetro 2).

Puede usar un depurador para ayudar a analizar este problema. Para obtener más información, consulte Análisis de volcado de memoria mediante los depuradores de Windows (WinDbg). La extensión de depuración !analyze indica información sobre la comprobación de errores y puede resultar útil para determinar la causa principal.

Para buscar el identificador y el recuento de punteros en el objeto, use el comando del depurador !object.

kd> !object address

Donde address es la dirección del objeto especificado en el Parámetro 2.

También puede establecer un punto de interrupción en el código que conduce a este código de detención e intentar avanzar un solo paso en el código con errores.

Si no está equipado para usar el depurador de Windows para trabajar con este problema, puede usar algunas técnicas básicas de solución de problemas.