Manejar un desbordamiento de pila no es la solución correcta, en su lugar, debe asegurarse de que su programa no desborde la pila.
No asigne variables grandes en la pila (donde lo que es "grande" depende del programa). Asegúrese de que cualquier algoritmo recursivo termine después de una profundidad máxima conocida. Si un algoritmo recursivo puede recurrir un número desconocido de veces o una gran cantidad de veces, puede administrar la recursión usted mismo (manteniendo su propia pila asignada dinámicamente) o transformar el algoritmo recursivo en un algoritmo iterativo equivalente
Un programa que debe ser "realmente robusto" no utilizará bibliotecas de terceros o externas que "consuman mucha pila".
Tenga en cuenta que algunas plataformas notifican un programa cuando se produce un desbordamiento de pila y permiten que el programa maneje el error. En Windows, por ejemplo, se lanza una excepción. Sin embargo, esta excepción no es una excepción de C++, es una excepción asincrónica. Mientras que una excepción de C++ solo puede lanzarse mediante una instrucción throw
, se puede lanzar una excepción asíncrona en cualquier momento durante la ejecución de un programa. Sin embargo, esto se espera porque un desbordamiento de pila puede ocurrir en cualquier momento: cualquier llamada de función o asignación de pila puede desbordar la pila.
El problema es que un desbordamiento de pila puede provocar una excepción asíncrona incluso desde el código que no espera arrojar ninguna excepción (por ejemplo, desde funciones marcadas noexcept
o throw()
en C++). Entonces, incluso si maneja esta excepción de alguna manera, no tiene forma de saber que su programa está en un estado seguro. Por lo tanto, la mejor manera de manejar una excepción asincrónica es no manejarla en absoluto (*). Si uno es arrojado, significa que el programa contiene un error.
Otras plataformas pueden tener métodos similares para "manejar" un error de desbordamiento de pila, pero cualquiera de estos métodos es probable que sufra el mismo problema: el código que se espera que no cause un error puede causar un error.
(*) Hay algunas excepciones muy raras.
http://support.microsoft.com/kb/315937 –
El estándar ni siquiera menciona la pila, se debe especificar la plataforma que se dirigen; varias plataformas proporcionan medios para interceptar el desbordamiento de la pila o incluso obtener una "alerta de desbordamiento de la pila" cuando la pila está casi agotada. –
Personalmente, encuentro que SO no es algo para evitar, sino para abrazar. ¡Solo mira la gran comunidad aquí! –