Tecnología

Inicio

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

Un desbordamiento de pila se produce cuando la pila, una estructura de datos críticos que se encuentra en cada programa que se ejecuta, supera sus límites de memoria. Esta condición tiene varias causas, todos los síntomas de errores de programación. Si el error se produce 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

La pila de llamadas, la causa más común de los desbordamientos de pila, mantiene una lista de las direcciones de retorno de cada función o método de llamada. Cuando se inicia 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 inserta en la pila. Cuando la función se completa, la dirección de retorno se hizo estallar de la pila y la ejecución continúa en esta dirección. La pila se expande y colapsa 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:

countNodes de función (nodo)
Para cada nodo en childNode

nodeCount += 1
countNodes(childNode)

siguiente
la función fin

El uso de algún tipo de estructura de árbol como un documento XML, el código cuenta el número de nodos de árbol que se encuentran debajo de un nodo dado. Cada nodo hijo sean contados, 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 programador escrito en lugar de nodo hijo de la siguiente manera:

countNodes de función (nodo)
Para cada nodo en childNode

nodeCount += 1
countNodes(Node)

siguiente
la función fin

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

La recursividad oculta

En la mayoría de los casos, los desarrolladores no están escribiendo intencionalmente código recursivo, pero la recursividad se pueden producir de manera más sutil. Tenga en cuenta estas tres funciones:

loadAccount función ()
LoadMainAccount ()
loadTransactions ()

la función fin

loadMainAccount función ()
loadAssociatedAccounts ()
end function

loadAssociatedAccounts función ()
loadAccount ()
end function

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.

Parámetros grandes

Además el seguimiento de puntos de retorno de llamada función, la pantalla también puede contener otros datos. La mayoría de los lenguajes usan la pila para mantener los parámetros de función y por lo general son los punteros de dirección sólo de las ubicaciones de los parámetros. Algunos lenguajes de empuje parámetros por valor en la pila y esto puede tomar mucho más espacio. El tamaño de la pila por defecto para la mayoría de los idiomas van desde 512K a 1 MB, por lo que grandes parámetros pasados ​​por valor podrían causar ocasionalmente un desbordamiento de pila. Si hay una necesidad de transmitir grandes parámetros por valor, consultar el manual de referencia del lenguaje para determinar la forma de aumentar la pila.

Variables de instancia

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

muestra la función ()
N = getCounter ()
Regreso n * 12
la función fin

La variable n es una variable de instancia, ya que sólo existe mientras la muestra se ejecuta la función. 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 matrices. Cuando esto se convierte en un problema, considere el uso de estructuras de datos incorporadas como cuerdas o listas. Estas estructuras generalmente asignan memoria en el montón, en una zona separada de memoria mucho mayor.