Saltar al contenido

¿Qué es un desbordamiento de pila?

Te doy la bienvenida a nuestro sitio web, en este lugar encontrarás la resolución a lo que estabas buscando.

Solución:

De Wikipedia:

En el software, se produce un desbordamiento de pila cuando se usa demasiada memoria en la pila de llamadas. En muchos lenguajes de programación, la pila de llamadas contiene una cantidad limitada de memoria, generalmente determinada al inicio del programa.

La pila es una estructura de datos que mantiene un registro del punto al que las subrutinas de un programa deben devolver el control cuando terminan de ejecutarse. Las direcciones de retorno son empujado en la pila a medida que se invocan las subrutinas, cuando la subrutina finaliza su ejecución, la dirección de retorno es tirado de la pila. Si hay muchas subrutinas y no hay espacio en la pila, se produce un desbordamiento de pila.

También en la pila está destinado a almacenar variables locales, por lo que si una variable local es demasiado grande, es más probable que la pila no tenga espacio para almacenarla, si este es el caso, también se produce un desbordamiento de la pila.

Wikipedia incluye un buen diagrama que representa la pila cuando un DrawLine subrutina es llamada desde otra subrutina llamada DrawSquareespero que esta imagen ayude a comprender mejor la estructura de la pila.

diagrama de pila

Hay dos causas principales de un desbordamiento de pila: recursiones de funciones profundas y variables de pila excesivamente grandes. Dado que estos son términos comunes en casi todos los lenguajes de programación, puede ocurrir un desbordamiento de pila además de la complejidad del lenguaje.

Contribución de Guffa: La pila no tiene nada que ver con la recolección de basura. Las aplicaciones modernas tienen una pila más grande, lo que hace que sea un poco menos probable que se desborde la pila, pero aparte de eso, no hay diferencia.

La pila contiene varios marcos de pila y se almacena en la memoria. Cada vez que se llama a una función, se agrega un nuevo marco de pila a la pila. Un marco de pila contiene los argumentos que se pasarán a la función que se llama y la dirección de retorno, de modo que cuando la función llamada haya terminado, la CPU sepa a dónde regresar para que pueda continuar ejecutando la función de llamada. El marco de pila también puede contener memoria para ser utilizada por variables locales de la función que se llama.

En este ejemplo, la función principal llamada WriteCustomerDetails y la llamada PrintToConsole para escribir bits de datos individuales que la función WriteCustomerDetails buscó:

‘=======parte superior de la pila=====================’
Función: PrintToConsole
Arg: John Smith, 34 Acacia Avenue, 23 años
‘————————————————- ———-‘
Función: WriteCustomerDetails
Arg: John Smith
‘————————————————- ———-‘
Función: Principal
‘======parte inferior de la pila===================’

Se produce un desbordamiento de pila si no se reservó suficiente espacio para la pila. Por lo general, una pila se encuentra en un gran bloque contiguo de memoria, por lo que no se divide en fragmentos, lo que significa que se necesita una gran parte de la memoria, y esto dificulta que el tiempo de ejecución intente aumentar el espacio reservado para la pila. si se llena.

Un desbordamiento de pila a menudo puede ocurrir cuando se escribe accidentalmente una función que se llama a sí misma. A veces está bien que una función se llame a sí misma siempre que haya un ‘si’ o alguna condición en la función que detenga las llamadas en algún momento. Esto se llama una función recursiva. Pero, si no se detiene y la función sigue llamándose a sí misma, o tal vez dos o más funciones siguen llamándose entre sí, muy rápidamente consumirán toda la memoria de la pila. Cuando no queda nada, obtiene un desbordamiento de pila y el programa falla.

Es posible que esto suceda en cualquier programa, no necesariamente tienen que ser complejos, y puede suceder en el código que ejecuta un sitio web. Y también puede ocurrir en lenguajes de secuencias de comandos.

Un desbordamiento de pila ocurre cuando usa demasiado espacio de pila. Generalmente hay dos situaciones cuando esto sucede:

La primera es cuando tienes un error en el código, provocando un bucle recursivo sin salida. Por ejemplo, una propiedad leyendo de sí misma:

public int Length 
   get 
      return Length;
   

La segunda es cuando tienes un bucle recursivo que es demasiado profundo. Como el espacio de la pila es limitado, solo puede anidar un algoritmo una determinada cantidad de veces. Si su algoritmo está anidado demasiado profundo para que se quede sin espacio de pila antes de que exista, obtendrá un desbordamiento de pila. Ejemplo:

public bool Odd(int value) 
   if (value == 0) 
      return false;
    else 
      return !Odd(value - 1);
   

Si llama a este método con un valor demasiado grande, se anidará demasiado profundo y provocará un desbordamiento de la pila.

Te invitamos a añadir valor a nuestra información asistiendo con tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *