try son que programar por pero muestra los las instrucciones identificar hacer excepcion errores error ejecuta dev compilacion compila como cero catch barra aparecer c++ sigsegv

son - excepcion division por cero c++



¿Qué es el error de tiempo de ejecución SIGSEGV en C++? (5)

Aquí hay un ejemplo de SIGSEGV.

root@pierr-desktop:/opt/playGround# cat test.c int main() { int * p ; * p = 0x1234; return 0 ; } root@pierr-desktop:/opt/playGround# g++ -o test test.c root@pierr-desktop:/opt/playGround# ./test Segmentation fault

Y aquí está el Wikipedia .

¿Cómo manejarlo?

  1. Evítalo lo más posible en primer lugar.

    Programe a la defensiva: use assert (), verifique el puntero NULO, verifique si hay un desbordamiento del búfer.

    Utilice herramientas de análisis estático para examinar su código.

    compila tu código con -Werror -Wall.

    ¿Alguien ha revisado tu código?

  2. Cuando eso realmente sucedió.

    Examina tu código cuidadosamente.

    Compruebe lo que ha cambiado desde la última vez que ejecutó el código correctamente sin bloqueo.

    Con suerte, gdb le dará una pila de llamadas para que sepa dónde ocurrió la falla.

EDIT: lo siento por una prisa. Debe ser *p = 0x1234; en lugar de p = 0x1234 ;

Necesito saber la causa raíz de la falla de segmentación, y también alguien puede decirme cómo manejarlo.


Hay varias causas de fallos de segmentación, pero fundamentalmente, está accediendo a la memoria incorrectamente. Esto puede deberse a la falta de referencia a un puntero nulo, al intentar modificar la memoria de solo lectura o al usar un puntero en algún lugar que no esté asignado al espacio de memoria de su proceso (eso probablemente significa que está tratando de usar un número como puntero). , o incrementaste un puntero demasiado lejos). En algunas máquinas, es posible que un acceso mal alineado a través de un puntero también cause el problema, si tiene una dirección impar y trata de leer un número par de bytes, por ejemplo (que puede generar SIGBUS, en su lugar).


el fallo de segmentación llega cuando accede a la memoria que no está declarada por el programa. Puede hacerlo a través de punteros, es decir, a través de direcciones de memoria. O esto también puede deberse a para, por ejemplo:

void rec_func() {int q = 5; rec_func();} int main() {rec_func();}

Esta llamada seguirá consumiendo memoria de la pila hasta que esté completamente llena y, por lo tanto, finalmente suceda el flujo de pila. Nota: es posible que no sea visible en algunas preguntas competitivas, ya que conduce a un tiempo de espera primero, pero para aquellas en las que el tiempo de espera no ocurre es un momento difícil de descifrar sigsemv.


utilizando un puntero inválido / nulo? ¿Superando los límites de una matriz? Algo difícil de ser específico sin ningún código de muestra.

Esencialmente, estás intentando acceder a la memoria que no pertenece a tu programa, por lo que el sistema operativo lo mata.


Wikipedia tiene la respuesta, junto con una serie de otras fuentes.

Una falla de seguridad básicamente significa que hiciste algo malo con los punteros. Esto es probablemente una falta de seguridad:

char *c = NULL; ... *c; // dereferencing a NULL pointer

O esto:

char *c = "Hello"; ... c[10] = ''z''; // out of bounds, or in this case, writing into read-only memory

O tal vez esto:

char *c = new char[10]; ... delete [] c; ... c[2] = ''z''; // accessing freed memory

El mismo principio básico en cada caso: estás haciendo algo con memoria que no es tuya.