3 votes

Comment gérer l'échec de l'allocation d'un tableau de pile en C ?

Si je dois écrire un code comme ci-dessous :

int a[10000000];

Je sais que le code peut parfois échouer en raison de débordements de pile. La question est de savoir comment gérer de telles erreurs au moment de l'exécution, et éviter le défaut de segmentation ?

6voto

Greg Hewgill Points 356191

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.

2voto

R.. Points 93718

Il n'y a aucun moyen de gérer cela au moment de l'exécution. La seule façon saine et sûre d'utiliser des objets de durée de stockage automatique en C est de les garder suffisamment petits pour être sûr qu'ils ne dépasseront jamais la quantité de pile dont vous savez que vous disposerez (par exemple, ne jamais utiliser plus de 10% environ de ce que vous pensez avoir).

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