¿Un desbordamiento de pila se produce cuando la pila, una estructura de datos fundamental que se encuentra en cada programa en ejecución, supera sus límites de memoria. Esta condición tiene varias causas , todos los síntomas de errores de programación. Si se produce un error en un programa comercial o de código abierto , en contacto con el soporte técnico . Si el problema se produce mientras se prueba su propio código, aquí están algunos de los problemas más comunes que pueden haber ocurrido en la línea 42 . Fondo Fotos
La pila de llamadas , la causa más común de desbordamientos de pila , contiene una lista de las direcciones de retorno de cada función o método de llamada. Cuando comience el programa , la pila de llamadas está vacía , entonces cuando la primera función se llama , la dirección de la línea inmediatamente después de la llamada a la función se empuja en la pila. Cuando la función termina , la dirección de retorno consigue apareció de la pila y la ejecución continúa en esta dirección . La pila se expande y se contrae en función del número de llamadas a funciones anidadas.
Recursividad
recursividad se produce cuando una función se llama a sí mismo. Considere el siguiente código:
countNodes función ( nodo) Para cada childNode en nodenodeCount + = 1countNodes ( childNode ) SiguienteFin función
Utilizando algún tipo de estructura de árbol como un documento XML, el código cuenta el número de nodos del árbol se encuentran bajo un nodo dado . Cada nodo hijo se contaba , entonces se pasa a la misma función para contar sus propios nodos secundarios. Esto continúa hasta que el niño no tiene hijos
Supongamos que el nodo con tipo programador en lugar del nodo hijo de la siguiente manera : .
CountNodes función ( nodo) Para cada childNode en nodenodeCount + = 1countNodes (nodo) SiguienteFin función
En este caso , la función se llame a sí misma indefinidamente y se produce un desbordamiento de pila .
Hidden recursividad
En la mayoría de los casos, los desarrolladores no están escribiendo intencionalmente código recursivo , pero recursividad se pueden presentar en formas más sutiles . Considere las siguientes tres funciones :
Función loadAccount () LoadMainAccount () loadTransactions () End función
Función loadMainAccount () loadAssociatedAccounts () función
función
final loadAssociatedAccounts () loadAccount ( ) fin de la función
En este caso , la recursión se produce indirectamente cuando una función llama a otra función que llama inadvertidamente la primera función . El resultado puede tardar un poco más , pero el resultado es un desbordamiento de pila .
Grandes Parámetros
Además de la función de seguimiento de puntos de devolución de llamada , la pila puede contener otros datos . La mayoría de lenguajes usan la pila para mantener los parámetros de función y estos son por lo general sólo abordan los punteros de las ubicaciones de los parámetros. Algunos idiomas empujan parámetros por valor en la pila , lo que puede tener mucho más espacio . El tamaño de pila predeterminado para la mayoría de los lenguajes van desde 512K a 1MB , por lo que grandes parámetros pasados por valor pueden ocasionalmente causar un desbordamiento de pila . Si hay una necesidad de pasar grandes parámetros por valor , consulte el manual de referencia del lenguaje para determinar la forma de aumentar la pila.
Variables de instancia
variables de instancia son las incluidas dentro de la función . Por ejemplo :
muestra la función ( ) N = getCounter () Retorno n * 12end función
La variable n es una variable de instancia , ya que sólo existe mientras que la muestra función ejecuta . En muchos idiomas , n es empujado en la pila , y luego se desprendió cuando la función termina . Esto funciona bien para las variables simples, como enteros y caracteres , pero puede llenar la pila cuando se utilizan grandes conjuntos . Cuando esto se convierte en un problema, considere el uso de una función de las estructuras de datos como cadenas o listas. Estas estructuras suelen asignar memoria en el montón , un área de memoria separada , mucho más grande.