2009-06-14 27 views
14

Soy muy consciente de la fealdad de esta cuestión, todavía me gustaría saber si es posible:¿Cómo comprobar si un puntero es válido?

Cuando un programa intenta leer/escribir en un puntero no válido (NULL, el bloque no asignado, etc ') ventanas bloquea la aplicación con una excepción de violación de acceso.

La pregunta es, ¿hay alguna manera de comprobar si este puntero generará una excepción antes de intentar usarlo o, de lo contrario, hay una forma de detectar esta excepción?

+0

Similar a http://stackoverflow.com/questions/683059/how-to-validate-lpvoid-to-bad-ptr/683085#683085 – Michael

+0

Similar a http://stackoverflow.com/search?q=IsBadReadptr – ChrisW

Respuesta

7

La mejor apuesta si tiene que usar punteros primas es asegurarse de que es ya sea un puntero o NULL válido. Luego puede verificar si es válido comprobando si es igual a NULL.

Pero para responder a su pregunta, puede ver este tipo de cosas con structured exception handling (SEH).

Dicho esto, SEH is a bad idea.

0

No sé acerca de Windows, pero en * nix puede instalar un controlador de señal SIGSEGV para interceptar la excepción.

+0

En Windows puede codificar un controlador de excepciones estructuradas para detectar la excepción. – ChrisW

+0

La gestión de señales no es específica de * nix: es parte de la biblioteca estándar ISO-C – Christoph

+0

Esto no ayuda mucho: después de que el controlador SIGSEGV haya finalizado, la ejecución del programa vuelve exactamente a la misma posición donde se originó la causa raíz de la señal . A menos que no salga dentro de su manejador de señal, creará un bucle infinito. Por lo tanto, en general, es una mala idea atrapar SIGSEGV. – lumpidu

3
+0

Sé que hay IsBadRead/WritePtr, no pude encontrar Versiones válidas. Sin embargo, MSDN dice que son obsceno –

+0

@Hammer: Perdón, quise decir "Malo", ahora corregido. Se consideran de mala calidad porque no son seguros en cuanto a los hilos, pero son lo más parecido a lo que pide el OP. – RichieHindle

7

Hay algunas funciones IsBadReadPtr y IsBadWritePtr que podría hacer lo que quiere. También hay an article que explica por qué no debe usarlos.

+2

De MSDN: "Importante: Esta función es obsoleta y no debe utilizarse. A pesar de su nombre, no garantiza que el puntero sea válido o que la memoria apuntada sea segura de usar." –

+0

Martillo, sí, están marcados como obsoletos y el artículo al que me he vinculado explica por qué. ¿Qué intentas lograr, de todos modos? – avakar

5

que sin duda puede probar si el puntero es NULL!

if (ptr == NULL) { 
    // don't use it 
} 

Esa es la única prueba portátil que puede hacer. Windows proporciona varias API para probar punteros, pero como otros han señalado, su uso puede ser problemático.

10

Encontrar este tipo de errores es abordar los síntomas, no la causa raíz.

Las siguientes expresiones idiomáticas trabajarán en cualquier plataforma:

  • inicializar todos los punteros a cero

  • si no se puede garantizar un puntero es válido, compruebe que no es 0 antes indirecting que

  • al eliminar objetos, establezca el puntero a 0 después de la eliminación

  • tener cuidado de oponerse cuestiones de propiedad al pasar punteros a otras funciones

Cuestiones relacionadas