527 votes

Stack Overflow

Je suis un débutant complet de l'écriture de Dérivation (le jeu) en Java. Tout allait bien jusqu'à ce que j'ai commencé à faire une erreur de dépassement de pile en fin de jeu. Malheureusement, je sais que, sans réellement mettre le code en ligne je ne vais pas vraiment être en mesure d'obtenir de l'aide avec cela. Donc je pensais que j'allais faire mon premier Stackoverflow.com question!

Ce qui est une erreur "stack overflow", quelles en sont les causes et comment faire de vrais programmeurs de traiter avec eux?

Merci beaucoup!

(oh, je suis en utilisant le mca bibliothèques (je pense), si c'est de l'aide?)

459voto

Sean Points 22088

Les paramètres et les variables locales sont allouées sur la pile (avec des types de référence de l'objet réside dans le tas et les références à des variables de l'objet). La pile généralement vit à l'extrémité supérieure de votre espace d'adresse et qu'il est utilisé, il se dirige vers le fond de l'espace d'adressage (c'est à dire vers zéro).

Votre processus a également un tas, qui vit au fin fond de votre processus. Que vous allouer de la mémoire ce segment peut pousser vers le haut de votre espace d'adressage. Comme vous pouvez le voir, il ya le potentiel pour le tas de "collision" avec la pile (un peu comme la tectonique des plaques!!!).

La commune de provoquer un débordement de pile est un mauvais appel récursif. Typiquement, cela se produit lorsque vos fonctions récursives qui n'ont pas de terminaison correcte condition, de sorte qu'il finit par appeler lui-même à jamais. Cependant, avec la programmation GUI il est possible de générer de la récursivité indirecte. Par exemple, votre application peut être de la manipulation des messages de peinture et de tout traitement, il peut en appeler une fonction qui provoque le système pour envoyer un autre message de peinture. Ici, vous n'avez pas explicitement appelé vous-même, mais l'OS/VM a fait pour vous.

Pour traiter avec eux, vous aurez besoin d'examiner votre code. Si vous avez des fonctions qui s'appellent eux-mêmes, puis vérifier que vous avez une condition d'arrêt. Si vous avez vérifiez ensuite que lors de l'appel de la fonction vous disposez d'au moins modifié l'un des arguments, sinon il n'y aura pas de changement visible pour l'appelée récursivement la fonction et la condition d'arrêt est inutile.

Si vous avez pas évident fonctions récursives puis vérifier pour voir si vous êtes à l'appel d'une des fonctions de la bibliothèque qui, indirectement, à cause de votre fonction à appeler (comme l'implicite cas ci-dessus).

69voto

Khoth Points 7001

Si vous avez une fonction comme:

int foo()
{
    // more stuff
    foo();
}

Puis foo() va continuer à l'appeler lui-même, l'obtention de plus en plus profond, et lorsque l'espace utilisé pour garder la trace de ce que les fonctions que vous êtes en est rempli, vous obtenez l'erreur de dépassement de pile.

26voto

Cheery Points 6696

Un débordement de pile que veut dire exactement: une débordements de pile. Habituellement, il y a une pile dans le programme qui contient local-portée des variables et des adresses de retour lors de l'exécution d'une routine se termine. Cette pile a tendance à être un fixe plage de mémoire quelque part dans la mémoire, donc c'est limité à combien il peut contenir des valeurs.

Si la pile est vide, vous ne pouvez pas sauter, si vous le faites, vous aurez stack underflow erreur.

Si la pile est pleine, vous ne pouvez pas pousser, si vous le faites, vous aurez erreur de dépassement de pile.

Afin de débordement de pile apparaît à l'endroit où vous allouer trop dans la pile. Par exemple, dans le parlé de la récursivité.

Certaines implémentations d'optimiser certaines formes de récurrences. La queue de la récursivité en particulier. Queue de fonctions récursives sont en forme de routines d'où l'appel récursif apparaît comme une dernière chose à ce que fait la routine. Un tel appel de routine obtient simplement réduit à un saut.

Certaines implémentations aller aussi loin que de mettre en œuvre leurs propres piles pour la récursivité, par conséquent, ils permettent la récursivité à continuer jusqu'à ce que le système manque de mémoire.

Chose la plus facile que vous pourriez essayer serait d'augmenter la taille de votre tapis si vous le pouvez. Si vous ne pouvez pas le faire même si, la deuxième meilleure chose serait de regarder si il y a quelque chose qui provoque clairement le débordement de la pile. Essayez-le en quelque chose d'impression avant et après l'appel à la routine. Cela vous aide à trouver le défaut de la routine.

11voto

Greg Points 132247

Un débordement de pile est généralement appelé par l'imbrication des appels de fonction trop profondément (surtout facile lors de l'utilisation de la récursivité, c'est à dire une fonction qui s'appelle elle-même), ou d'allouer une grande quantité de mémoire sur la pile où à l'aide du tas serait plus approprié.

7voto

Chris Jester-Young Points 102876

Comme vous le dites, vous avez besoin de montrer un peu de code. :-)

Une erreur de dépassement de pile se produit généralement lors de vos appels de fonction nid trop profondément. Voir le Débordement de la Pile du Code de Golf thread pour quelques exemples de comment cela se passe (bien que dans le cas de cette question, les réponses intentionnellement causer un débordement de pile).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X