Quel est le déroulement de pile?
Qu'est-ce que le déroulement de pile? Fouillé, mais ne pouvait pas trouver de réponse instructive!
- Si il ne sait pas ce que c'est, comment pouvez-vous attendre de lui pour savoir qu'ils ne sont pas les mêmes pour le C et le C++?
- Alors, comment le concept de "déroulement de pile" est différent dans le C & C++?
- C est pas de la manipulation d'exception, de sorte que le déroulement de pile est très simple, cependant, en C++, si une exception est levée ou d'une fonction se termine, le déroulement de pile implique la destruction de tout les objets C++ automatique de la durée de stockage.
Vous devez vous connecter pour publier un commentaire.
Le déroulement de pile est généralement parlé en relation avec la gestion des exceptions. Voici un exemple:
Ici la mémoire allouée pour
pleak
seront perdues si une exception est levée, alors que la mémoire allouée às
sera correctement publiés parstd::string
destructeur dans tous les cas. Les objets alloués sur la pile sont "déroulé" quand le champ est sorti (ici la portée de la fonctionfunc
.) Ceci est fait par le compilateur insertion des appels à des destructeurs de l'automatique (pile) variables.Maintenant, c'est un concept très puissant menant à la technique dite de RAII, c'est-à l'Acquisition de Ressources Est d'Initialisation, qui nous aide à gérer les ressources comme la mémoire, de connexions de base de données, descripteurs de fichiers ouverts, etc. en C++.
Maintenant qui nous permet de fournir exception les garanties de sécurité.
delete [] pleak;
est atteinte seulement si x == 0.Tout cela se rapporte à C++:
Définition:
Comme vous créez des objets de manière statique (sur la pile plutôt que de leur répartition dans le segment de mémoire) et d'effectuer des appels de fonction, ils sont "empilés".
Lorsqu'un champ (tout ce qui est délimitée par
{
et}
) est sorti (en utilisantreturn XXX;
, pour atteindre la fin de la portée ou de la levée d'une exception) tout à l'intérieur de celui-ci est détruit (les destructeurs sont appelés pour tout). Ce processus de destruction des objets locaux et d'appeler les destructeurs est appelé le déroulement de pile.Vous avez des questions suivantes relatives au déroulement de pile:
éviter les fuites de mémoire (tout ce qui est allouée dynamiquement qui n'est pas géré par un objet local et nettoyé dans le destructeur sera coulé) - voir le RAII visée à par Nikolai, et la documentation de boost::scoped_ptr ou cet exemple de l'utilisation de boost::mutex::scoped_lock.
la cohérence du programme: le C++ spécifications état que vous ne devez jamais jeter une exception avant toute exception existante a été traitée. Cela signifie que la pile processus de déroulement ne doit jamais lever une exception (utiliser uniquement le code ne garantie pas à jeter dans les destructeurs, ou surround tout en les destructeurs avec
try {
et} catch(...) {}
).Si tout destructeur déclenche une exception pendant le déroulement de pile vous vous retrouvez dans la terre de comportement indéfini qui pourrait causer votre programme afin de s'interrompre de façon inattendue (la plus commune de comportement) ou de l'univers jusqu'à la fin (en théorie possible, mais n'a pas été observée dans la pratique).
Dans un sens général, une pile de "détente" est à peu près synonyme de la fin de l'appel de la fonction et de la suite éclatement de la pile.
Toutefois, en particulier dans le cas de C++, le déroulement de pile a à voir avec la façon dont C++ appelle les destructeurs des objets alloués depuis la route de tout bloc de code. Les objets qui ont été créés à l'intérieur du bloc sont libérés dans l'ordre inverse de leur allocation.
try
blocs. Pile d'objets alloués dans aucun bloc (sitry
ou pas) est soumis au dénouement lorsque le bloc de sorties.Le déroulement de pile est la plupart du temps C++ concept, comment la pile objets alloués sont détruits lors de son champ d'application est quittée (soit normalement, ou par le biais d'une exception).
Dire que vous avez ce fragment de code:
Je ne sais pas si vous lisez encore, mais L'article de Wikipedia sur la pile d'appel a une explication décente.
Déroulement:
D'Inspection[modifier]
J'ai lu un post de blog qui m'a aidé à comprendre.
Vous pouvez trouvé le post complet ici.
Tout le monde a parlé de la gestion des exceptions en C++. Mais,je pense qu'il y a une autre connotation pour le déroulement de pile et qui est liée à de débogage. Un débogueur a à faire, le déroulement de pile à chaque fois qu'il est censé aller à une image précédente à l'image actuelle. Cependant, c'est en quelque sorte virtuel déroulement, car elle a besoin de rembobiner, quand il revient à l'image actuelle. L'exemple de ce qui pourrait être vers le haut/vers le bas/bt commandes de gdb.
De l'OMI, le diagramme ci-dessous dans ce l'article magnifiquement explique l'effet de déroulement de pile sur la route de la prochaine instruction à être exécutée une fois, une exception est levée, qui est non-traitée):
Dans le pic:
Dans le deuxième cas, lorsqu'une exception se produit, la pile d'appel de fonction est linéaire recherché pour le gestionnaire d'exception. La recherche se termine à la fonction de gestionnaire d'exceptions, c'est à dire
main()
avec joignanttry-catch
bloc, mais pas avant suppression de toutes les entrées à l'avant de la pile d'appel.C++ runtime détruit toutes les variables automatiques créé entre les entre les jeter & attraper. Dans cet exemple simple ci-dessous f1() throws et main() captures, entre les objets de type B et A sont créés sur la pile dans l'ordre. Lors de la f1() throws, B et destructeurs sont appelés.
La sortie de ce programme sera
C'est parce que le programme de la pile lors de la f1() throws ressemble
Ainsi, lors de la f1() est sortie, automatique variable b est détruit, et puis quand f() est sortie automatique de la variable a est détruit.
Espère que cette aide, bon codage!
Lorsqu'une exception est levée et le contrôle passe à partir d'un bloc try pour un gestionnaire, le C++ moment de l'exécution des appels destructeurs pour tout automatique des objets construits depuis le début du bloc try. Ce processus est appelé le déroulement de pile. L'automatique objets sont détruits dans l'ordre inverse de leur construction. (Automatique des objets locaux objets qui ont été déclarées auto ou vous inscrire, ou non déclarée statique ou externe. Automatique de l'objet x est supprimé à chaque fois que le programme des sorties du bloc dans lequel x est déclarée.)
Si une exception est levée lors de la construction d'un objet composé de sous-objets ou des éléments de tableau, les destructeurs ne sont appelés pour ces sous-objets ou des éléments d'un tableau construit avec succès avant la levée de l'exception. Un destructeur pour un objet statique sera appelée uniquement si l'objet a été construit avec succès.
En Java pile unwiding ou unwounding n'est pas très important (garbage collector). Dans de nombreux exception de la manipulation de papiers que j'ai vu ce concept (le déroulement de pile), en particulier ceux writters traite de la gestion des exceptions en C ou C++. avec
try catch
blocs de nous shouln'oubliez pas: gratuit de la pile de tous les objets après les blocs de.