? Un débordement de pile se produit lorsque la pile, une structure de données critique trouvée dans chaque programme en cours, a dépassé ses limites de mémoire. Cette condition a plusieurs causes , les symptômes d' erreurs de programmation. Si l'erreur apparaît dans un programme de source commerciale ou ouvert , contactez d'assistance technique. Si le problème se produit , tout en testant votre propre code, voici quelques-unes des questions les plus courantes qui peuvent avoir eu lieu à la ligne 42 . Contexte
La pile d'appel , la cause la plus fréquente des débordements de pile , tient une liste des adresses de retour de chaque appel d'une fonction ou d'une méthode . Lorsque le programme commence , la pile d'appels est vide, puis lorsque la première fonction est appelée , l'adresse de la ligne immédiatement après l'appel de fonction est poussé sur la pile. Lorsque la fonction est terminée, l'adresse de retour se extraites de la pile et l'exécution se poursuit à cette adresse. La pile se dilate et se rétracte en fonction du nombre d'appels de fonction imbriqués.
Récursivité
récursivité se produit lorsqu'une fonction s'appelle elle-même . Considérons le code suivant :
countNodes de fonction ( node) Pour chaque childNode dans nodenodeCount + = 1countNodes ( childNode ) nextEnd fonction
utilisant une sorte de structure arborescente comme un document XML , ce code compte le nombre de nœuds de l'arbre se trouvant sous un noeud donné . Chaque nœud enfant est compté, alors il est transmis dans la même fonction à compter ses propres nœuds enfants. Cela continue jusqu'à ce que l'enfant n'a pas d'enfants
Supposons que le nœud typé programmeur au lieu de nœud enfant comme suit : .
CountNodes de fonction ( node) Pour chaque childNode dans nodenodeCount + = 1countNodes (Node ) nextEnd fonction:
Dans ce cas , la fonction s'appellerait indéfiniment et un débordement de pile se produit.
Invisible récursivité
Dans la plupart des cas, Les développeurs ne sont pas intentionnellement l'écriture de code récursif , mais récursion peuvent se produire de façon plus subtile . Tenez compte de ces trois fonctions:
loadAccount de fonction ( ) de LoadMainAccount () loadTransactions () End Function
loadMainAccount de fonction ( ) loadAssociatedAccounts () function function
d'iPhone de fin loadAssociatedAccounts () de loadAccount ( ) End Function
Dans ce cas , la récursivité est indirecte lorsqu'une fonction appelle une autre fonction qui appelle par inadvertance la première fonction. Le résultat peut prendre un peu plus longtemps, mais le résultat est un débordement de pile .
Grands paramètres
Outre la fonction de suivi des points de retour d'appel, la pile peut également contenir d'autres données . La plupart des langues utilisent la pile pour maintenir les paramètres de fonction et ceux-ci sont habituellement juste pointeurs d'adresses des emplacements de paramètres. Certaines langues poussent paramètres par valeur sur la pile , ce qui peut prendre beaucoup plus d'espace . La taille de pile par défaut pour la plupart des langues gamme de 512K à 1 Mo, si grands paramètres passés par valeur peuvent parfois causer un débordement de pile . Si il est nécessaire de passer de grands paramètres par valeur , consultez le manuel de référence du langage afin de déterminer comment augmenter la pile.
Variables d'instance
variables d'instance de
sont ceux intégrés à l'intérieur de la fonction. Par exemple:
échantillon de fonction ( ) N = getCounter () Return n * 12end fonction
La variable n est une variable d'instance , car il n'existe que pendant que l'échantillon de la fonction s'exécute. Dans de nombreuses langues , n est poussé sur la pile , puis s'est détaché lorsque la fonction se termine. Cela fonctionne bien pour les variables simples comme les entiers et les personnages , mais peut remplir la pile lors de grands tableaux sont utilisés. Quand cela devient un problème , pensez à utiliser intégré dans les structures de données comme les chaînes ou les listes . Ces structures allouent généralement mémoire sur le tas , une , beaucoup plus grande zone de mémoire séparée .