Se produce un error de tiempo de ejecución mientras se ejecuta el programa. Debido a que esto no es un error de compilación, la compilación se completará con éxito. Aquí, aprenderemos a manejar las excepciones de tiempo de ejecución en C++.
Hay 5 tipos de excepciones de tiempo de ejecución discutidas aquí:
- División por cero.
- Fallos de segmentación.
- Asignación de memoria grande/Asignación de memoria estática grande.
- Error de especificador de tipo.
- Acceso a memoria no válido durante el tiempo de ejecución.
Comencemos analizando cada uno de estos errores de tiempo de ejecución en detalle.
1. División por cero
Cuando dividimos un valor entero por cero, obtenemos este tipo de error llamado error de división por cero. También se denomina excepciones de punto flotante (SIGFPE). A continuación se muestra el programa C++ para demostrar la división por excepción cero:
C++
// C++ program to demonstrate // division by zero exception #include <iostream> using namespace std; // Driver code int main() { int a = 10; int res = a / 0; cout << res; return 0; }
Producción:
2. Fallos de segmentación
En el siguiente código, la línea *(str + 1) = ‘n’ intenta escribir en la memoria de solo lectura. A continuación se muestra el programa C++ para demostrar la falla de segmentación:
C++
// C++ program to demonstrate // segmentation fault #include <iostream> using namespace std; // Driver code int main() { char *str; // Stored in read only part // of data segment str = "GeeksforGeeks"; // Trying to modify read only // memory *(str + 1) = 'n'; return 0; }
Producción:
3. Asignación de memoria grande/Asignación de memoria estática grande
En general, cualquier compilador o lenguaje aceptará hasta 10^8. Sin embargo, para estar seguros, generalmente usamos hasta 10 ^ 7. En el siguiente código, el tamaño de la array es más de 10 ^ 8, por lo que aquí tenemos un error debido a una gran asignación de memoria. También se denomina señal de cancelación (SIGABRT).
A continuación se muestra el programa C++ para demostrar una gran excepción de tiempo de ejecución de asignación de memoria:
C++
// C++ program to demonstrate // large memory allocation // runtime exception #include <iostream> using namespace std; // Driver code int main() { int a = 100000000000; int * arr = new int[a]; return 0; }
Producción:
4. Error de especificador de tipo
El siguiente código da un error de tiempo de ejecución porque aquí la variable «a» se define como long long int pero en scanf el especificador de formato utilizado es %d en lugar de %lld, lo que provocará el error.
A continuación se muestra el programa C++ para demostrar el error del especificador de tipo:
C++
// C++ program to demonstrate // type specifier error #include <iostream> using namespace std; // Driver code int main() { long long int a; scanf("%d", &a); return 0; }
Producción:
prog.cpp: En la función ‘int main()’:
prog.cpp:10:19: advertencia: el formato ‘%d’ espera un argumento del tipo ‘int*’, pero el argumento 2 tiene el tipo ‘long long int*’ [-Wformat=]
scanf(“%d”, &a);
^
5. Acceso a memoria no válido durante el tiempo de ejecución
En el siguiente código, la array se asigna con un valor de índice negativo y esto provocará un acceso a la memoria no válido. Dará un valor basura. A continuación se muestra el programa C++ para demostrar el acceso a la memoria no válido durante el tiempo de ejecución:
C++
// C++ program to demonstrate // invalid memory access during // runtime #include <iostream> using namespace std; int arr[5]; // Driver code int main() { int a = arr[-10]; cout << a; return 0; }
281923776