2010-10-14 13 views
4

Si vous écrivez int m[1000000]; à l'intérieur de la fonction principale de C/C++, il y aura une erreur d'exécution pour le dépassement de pile. Au lieu de cela, si vous écrivez vector<int> m;, puis push_back 1000000 éléments là-bas, il fonctionnera bien.Dépassement de pile - mémoire statique ou mémoire dynamique

Je suis très curieux de savoir pourquoi cela se produit. Ils sont tous les deux la mémoire locale, n'est-ce pas? Merci d'avance.

+0

duplication possible de [Y at-il une limite de longueur de tableau maximale en C++?] (Http://stackoverflow.com/questions/216259/is-there-a-max-array-length-limit-in-c) –

+0

Qu'entendez-vous par "mémoire" locale? – nobar

+1

"Faites le bien, alors faites vite." –

Répondre

12

Oui, le vecteur lui-même est un objet automatique (pile). Mais le vecteur contient un pointeur sur son contenu (un tableau dynamique interne), qui sera alloué sur le tas (par défaut). Pour simplifier un peu, vous pouvez penser à vector en faisant malloc/realloc ou new[] appels en interne (en fait, il utilise un allocator).

EDIT: Comme je l'ai noté, les variables automatiques sont allouées sur la pile, tandis que malloc alloue généralement sur le tas. La mémoire disponible pour chacun est plate-forme et même spécifique à la configuration, mais la mémoire de pile disponible est généralement plus limitée.

+0

vous avez oublié d'expliquer les limites de taille de tas vs pile. malloc/realloc/new sont tous dandy, mais ils n'expliquent pas vraiment quoi que ce soit .. – ianmac45

+0

@ matthew-flaschen: Cela peut être légèrement différent mais j'ai un problème avec ça. Maintenant, si je veux fournir un allocateur personnalisé pour ces classes et qui sera de différentes tailles (à coup sûr), je dois utiliser le placement nouveau et remplacer le nouveau/supprimer. Maintenant, les gestionnaires de la mémoire normale est fragmenté, donc j'ai posté une question ici, http://stackoverflow.com/questions/3920453/custom-memory-allocator-manager-in-c-which-approach. – yadab

+1

@ ianmac45, la question était de savoir si elles étaient à la fois "mémoire locale". Comme je l'ai expliqué, 'vecteur' utilise la mémoire heap (" non-local "). Je vais élaborer sur les problèmes de taille. –

1

L'objet vectoriel lui-même est sur la pile; mais en interne, il va allouer la mémoire du tas comme nécessaire pour stocker un nombre arbitraire d'éléments. Le coût de la pile est donc petit et fixe pour cela.

6

La quantité de mémoire de pile est limitée car elle doit être réservée à l'avance. Cependant, la quantité de mémoire segmentée va généralement dépasser les limites imposées par votre système d'exploitation, mais "presque" atteindre les limites de votre espace d'adressage virtuel (2 Go pour une machine 32 bits, beaucoup plus pour un 64 bits machine).

Vous pouvez augmenter la quantité d'espace de la pile réservée, généralement en tant que paramètre de votre éditeur de liens.

+2

Vous avez oublié de mentionner que c'est spécifique au système. Sur GNU/Linux, vous pouvez utiliser 'ulimit -s' pour augmenter la taille de la pile juste avant l'exécution. –

+0

Oui, j'ai oublié ça! –

5

int m [1000000] - Il va allouer les 1000000 ints sur la pile. comme la pile est limitée, l'erreur d'exécution de débordement de la pile sera lancée.

vecteur m; puis push_back de 1000000 éléments fonctionnent car vecteur interne alloue la mémoire sur tas pas sur la pile. donc, dans votre pile d'applications, seul l'objet vectoriel est présent, donc il ne lance pas l'erreur d'exécution de dépassement de pile.