c++ - segmentation - Pruebe/Capture un error de segmentación en Linux
segmentation fault(core dumped) c (9)
Tengo una aplicación Linux C ++ y me gustaría probar la validez de un puntero a un objeto antes de desreferenciarlo. Sin embargo, try / catch no funciona para esto en Linux debido a la falla de segmentación. ¿Cómo puede hacerse esto?
¿Cómo se prueba el puntero para la validez? Comparar con NULL?
Lo mejor que puedes hacer es ejecutar tu programa en Valgrind . Un error puede estar en un lugar bastante diferente.
Actualización: en la plataforma Win32 hay algo como __try __except que permite detectar algunas excepciones. Hasta donde sé, no hay un equivalente de Linux para esa función de Win32.
Inicialice su puntero a NULL. Si después de algún procesamiento sigue siendo NULL, no es válido; de lo contrario, es válido.
Los punteros se almacenan en objetos. Se inicializan en el constructor, potencialmente a 0 (NULO). Se eliminan en el destructor, posiblemente en la asignación y rara vez en otras funciones. Cuando se eliminan en miembros que no sean el destructor, se les asigna inmediatamente un nuevo valor o 0.
No existe una forma natural y universal con los punteros C ++ sin formato. C ++ supone que hará un seguimiento de esa información.
En la mayoría de las situaciones, puede manejar esto al recordar establecer punteros a NULL cuando no son válidos. Los nuevos punteros que inicialmente no apuntan deben establecerse en NULL y los objetos recién eliminados deben tener sus punteros establecidos en NULL.
Puede habilitar un manejador de señal para SIGSEGV para esta ocurrencia. Vea la "señal" de la página del manual para más detalles. La otra alternativa es usar referencias que garanticen ser válidas. Depende de tu aplicación, por supuesto.
Si adjunta un controlador al SIGSEGV, no hay mucho que pueda hacer además de registrar el hecho de que el error ocurrió y fallar con elegancia. Su programa se encuentra en un estado indefinido cuando ocurre esta infracción y, por lo tanto, puede no ser seguro continuar con la operación normal.
Más allá de buscar NULL, no creo que haya una manera de verificar si un puntero es ''válido'' en el sentido que estás describiendo. Durante la operación normal, errores como este no deberían ocurrir ya que representan un error, por lo que debería querer que su programa falle, aunque con gracia.
Una falla de segmentación no es una excepción (como la NullPointerException de Java); es una señal enviada desde el SO al proceso. Eche un vistazo a la página de manual de sigaction para los punteros sobre cómo instalar un controlador para el error de segmentación (SIGSEGV).
En general, con respecto a la idea bastante extraña de "verificar un puntero que no sea NULL para la validez", eche un vistazo a este artículo: http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx ( "IsBadXxxPtr realmente debería llamarse CrashProgramRandomly")
Si tiene un escenario en el que muchos punteros de su aplicación hacen referencia a los mismos objetos de vida útil limitada, una solución popular es utilizar impulsores inteligentes . Editar: en C ++ 11, ambos tipos están disponibles en la biblioteca estándar
shared_ptr
utilizar shared_ptr
para los punteros que son responsables de la duración de su objeto y weak_ptr
para los demás punteros, que pueden weak_ptr
de ser válidos. Verás que weak_ptr
tiene la verificación de validez que estás pidiendo.