2010-06-18 12 views
9

Me preguntaba si hay una posibilidad de detectar errores como este en C++:¿Puedo detectar errores de puntero malo en C++?

object* p = new object; 

delete p; 
delete p; // This would cause an error, can I catch this? 
  1. puedo comprobar si el puntero es válido?
  2. ¿Puedo detectar algunas excepciones?

Sé que podría establecer el puntero p en después de la eliminación del primer objeto. Pero imagina que no harías eso.

+5

La pregunta no es cómo recuperarse de tales errores, la pregunta es cómo no hacerlos en primer lugar. (Lo mismo ocurre con la configuración de punteros a 'NULL'. ¿Por qué un puntero en el alcance no se refiere a algo?) C++ viene con muchas construcciones que le impiden administrar punteros manualmente (y otros recursos). En la última década de hacer C++, casi nunca tuve que 'borrar 'nada manualmente. – sbi

+0

@Job. Correcto, debería haber sacado la referencia. –

Respuesta

10

No creo que pueda detectar este tipo de error porque creo que el resultado es un comportamiento indefinido. Podría no hacer nada, podría colapsar, podría corromper la memoria y causar un problema más adelante en la línea.

Si descubrió que hizo algo específico con su compilador actual, podría tratar de manejarlo, pero podría hacer cosas diferentes en depuración y versión, y diferente cuando actualice la versión del compilador.

Se ha sugerido establecer el puntero a nulo, pero creo que sería mejor utilizar punteros inteligentes y no eliminarlos en absoluto.

+2

Utilice punteros inteligentes, fin de, realmente. – Puppy

1

Por desgracia, no puedo hablar por el mundo de Windows, pero sé que hay algunas herramientas en el mundo Unix que hace esto para usted (en tiempo de ejecución)

La idea es implementar las funciones de asignación de memoria, junto con algunos controles adicionales. Se le puede decir a la biblioteca que aborte el proceso cuando se encuentre un problema y usted puede encontrar el problema mirando el rastro de la pila. libumem en solaris es un ejemplo de esto.

Estoy seguro de que debe haber cosas similares en la plataforma de Windows.

Existen otras herramientas que realizan análisis de código estático, que le ayudarán a encontrar los problemas antes de ejecutar el código. Coverity es un ejemplo, y creo que funciona también en Windows. Hemos logrado encontrar bastantes problemas potenciales con la cobertura. Desafortunadamente, no es gratis. Sin embargo, las versiones de evaluación deberían ser posibles.

+0

Otra herramienta útil (no gratuita) es Purify. Es un comprobador de acceso a la memoria de tiempo de ejecución, y funciona muy bien, detectando todo tipo de problemas potenciales. Si estás en Linux, también hay valgrind y efence. –

2

¿Por qué nadie quiere usar punteros inteligentes como boost::shared_ptr? Si lo usa, puede olvidar delete -operador. ;)

Cuestiones relacionadas