¿Qué es el desbordamiento de pila en la línea 42?




Fondo

La pila de llamadas, la causa más común de desbordamiento de pila, mantiene una lista de direcciones de retorno de cada función o método de llamada. Al iniciar el programa, la pila de llamadas está vacía, cuando se llama a la primera función, la dirección de la línea inmediatamente después de la llamada a la función se inserta en la pila. Cuando la función termina, la dirección de retorno se extrae de la pila, y la ejecución continúa en esta dirección. La pila se expande y contrae en función del número de llamadas a funciones anidadas.

La recursividad

La recursividad se produce cuando una función se llama a sí mismo. Considere el siguiente código:



Función CountNodes (nodo)
Para cada nodo childNode
nodeCount + = 1
countNodes (childNode)
siguiente
End Function

Uso de una especie de árbol como un documento XML, el código de cuenta el número de nodos del árbol encontrado en un nodo dado. Cada nodo hijo se cuenta, a continuación, se pasa en la misma función para contar sus nodos secundarios. Esto continúa hasta que el niño no tiene hijos.

Supongamos que el programador en lugar de con tipo nodo hijo del nodo de la siguiente manera:

Función CountNodes (nodo)
Para cada nodo childNode
nodeCount + = 1
countNodes (nodo)
siguiente
End Function

En este caso, la función se llame a sí misma indefinidamente y se produce un desbordamiento de pila.

Recursividad Ocultos

En la mayoría de los casos, los desarrolladores no están escribiendo código intencionalmente recursiva, pero recursividad puede ocurrir de maneras más sutiles. Considere las siguientes tres funciones:

Función LoadAccount ()
LoadMainAccount ()
loadTransactions ()
End Function

Función LoadMainAccount ()
loadAssociatedAccounts ()
fin de la función

loadAssociatedAccounts function ()
loadAccount ()
fin de la función

En este caso, la repetición indirecta se produce cuando una función llama a otra función que llama a la primera función inadvertidamente. El resultado puede tardar un poco más, pero el resultado es un desbordamiento de pila.

Parámetros importantes

Además de supervisar las funciones de los puntos de retorno de la llamada, la pila puede contener también otros datos. La mayoría de lenguajes usan la pila para mantener los parámetros de la función y estos son por lo general sólo se refieren a los punteros de las posiciones de los parámetros. Algunos idiomas empujan parámetros por valor en la pila, lo que puede tomar mucho más espacio. El tamaño de pila predeterminado para la mayoría de los idiomas varía de 512K a 1MB, para amplios parámetros pasados por valor en ocasiones puede provocar 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.

Las variables de instancia

Las variables de instancia son las incluidas dentro de la función. Por ejemplo:

Función de ejemplo ()
N = GetCounter ()
Vuelva n * 12
End Function

La variable n es una variable de instancia, ya que sólo existe mientras que la función de ejemplo realiza. En muchos idiomas, n se inserta en la pila, y luego falló con un globo cuando la función termina. Esto funciona bien para las variables simples, como enteros y caracteres, pero puede llenar la pila cuando el uso de grandes matrices. Cuando esto se convierte en un problema, puede utilizar una función de las estructuras de datos, tales como cadenas o listas. Estas estructuras normalmente asignan memoria en el montón, un área mucho más grande de memoria independiente.



Deja un comentario