En général, les exceptions de débordement de pile sont très difficiles à traiter de manière gracieuse. Ceci est dû au fait que la pile est déjà a débordé, et pour que du code supplémentaire (même du code de gestion des exceptions) puisse être exécuté, il faut qu'il y ait de l'espace de pile disponible.
En général, les programmeurs conçoivent les programmes de manière à ce qu'ils ne puissent pas déborder de la pile. Cela implique :
- en limitant au maximum la taille des variables automatiques allouées sur la pile (et en utilisant d'autres types d'allocation si de grandes structures de données sont nécessaires)
- en évitant les récursions inutiles et, si une récursion est utilisée, en veillant à ce que des contraintes raisonnables soient imposées à la profondeur maximale.
Si vous avez besoin d'espace pour dix millions d'entiers à l'intérieur d'une fonction, ne l'allouez pas sur la pile - allouez-le en utilisant la fonction malloc()
o new
(selon que vous utilisez réellement C ou C++). Bien entendu, il vous incombe également de free()
o delete
quand vous en avez fini avec elle.
Si vous utilisez vraiment le C++ [1] alors vous devriez probablement utiliser std::vector
à la place :
std::vector a(10000000);
L'implémentation de la bibliothèque standard sous-jacente allouera l'espace sur le magasin libre, et le désallouera automatiquement pour vous lorsque votre fonction reviendra.
[1] J'aimerais que les gens ne marquent pas les questions avec les deux. <a href="https://stackoverflow.com/questions/tagged/c" class="post-tag" title="show questions tagged 'c'" rel="tag">c </a>y <a href="https://stackoverflow.com/questions/tagged/c%2b%2b" class="post-tag" title="show questions tagged 'c++'" rel="tag">c++ </a>juste parce qu'ils sont orthographiés de manière similaire.