Buenas, mi duda es sobre si es posible capturar de alguna forma un error de violacion de segmento para que el programa no 'explote'. Gracias
Cita de: mart412 en 19 Octubre 2016, 16:36 PM
Buenas, mi duda es sobre si es posible capturar de alguna forma un error de violacion de segmento para que el programa no 'explote'. Gracias
Claro que se puede, el proceso para eso se llama debug.
https://en.wikipedia.org/wiki/C%2B%2B#Exception_handling
try
{
int *x = 0;
*x = 666;
}
catch(...)
{
cout << "doh";
}
Ahora podes investigar al respecto, te recomiendo leer el capitulo correspondiente de cualquier libro de C++.
PD. Depurar es otra cosa.
Yo me había alegrado tanto cuando Eternal Idol había puesto ese código, creyendo yo que se podría manejar una excepción de acceso de memoria no permitido... pero no funciona, el programa ese se cuelga (crash) en Windows 8.1... Lástima :(
No puedes usar los bloques try/catch para capturar un segmentation fault, porque no es una excepción mas bien es una señal que el sistema operativo envía como consecuencia al intentar acceder en alguna zona de memoria no permitida. Además no veo razón para hacer esto, porque continuar el programa después no es posible se invocaría comportamiento indefinido y esto no es nada seguro.
Hablando de CPU, si que se trataría de una excepción (lanzada por la CPU). Otra cosa es lo que considera C++/Sistema Operativo. Hubiera estado bien para ciertos casos.
Cita de: class_OpenGL en 19 Octubre 2016, 22:56 PM
Hablando de CPU, si que se trataría de una excepción (lanzada por la CPU). Otra cosa es lo que considera C++/Sistema Operativo.
Tienes razón es una excepción lanzada por la CPU, pero el sistema operativo la envía como una señal de que ocurrió algún error a nivel hardware.
Ese es el mecanismo standard que provee el lenguaje C++ para capturar excepciones lo cual no implica que esta en particular sea controlada por C++. En Windows, donde no hay ninguna señal, el codigo funciona perfectamente con VC++ (aunque lo ideal seria usar SEH). En POSIX tenes: https://en.wikipedia.org/wiki/Sigaction
__try
{
int *x = 0;
*x = 666;
}
__except( EXCEPTION_EXECUTE_HANDLER)
{
cout << " doh";
}
Y mas informacion para concluir: https://en.wikipedia.org/wiki/Segmentation_fault