2010-10-06 3 views
8

J'ai un projet qui utilise beaucoup STL. Maintenant, je travaille sur le portage du projet à une plate-forme spécifique qui ne supporte pas les exceptions. Je peux désactiver les exceptions, mais j'ai toujours besoin de gérer les erreurs STL.Gestion des erreurs STL sans exception

Existe-t-il une approche pour gérer correctement les erreurs STL avec des exceptions désactivées? Y a-t-il une implémentation tierce de STL qui aide?

Répondre

6

Le problème de prendre un co-conteneur de bibliothèque std existant et de compiler avec des exceptions désactivées est que les interfaces du conteneur std elles-mêmes supposent que les exceptions sont activées. En utilisant des exceptions, l'opérateur new lancera s'il ne peut pas acquérir de mémoire, sans exceptions, l'opérateur new renvoie un 0 à la place, ce que les conteneurs std ne peuvent pas gérer.

Une approche consiste à n'utiliser que des algorithmes STL + vecteur. Vous pouvez répliquer environ 95% de ce que font les autres conteneurs en utilisant ceci. Le problème est que la plupart des implémentations de STL supposent que

v.reserve(v.size()+1); 
assert(v.size()+1<=v.capacity()); 

ne sera jamais assert (puisque la réserve se lancer s'il n'y a pas de mémoire). Pour m'assurer que cela ne se produise jamais, j'ai utilisé des conteneurs "à capacité fixe", c'est-à-dire des conteneurs dont la capacité a été fixée au moment de la compilation. Fondamentalement, ce sont des vecteurs où je passe dans un allocateur spécial. Ensuite, vous pouvez vérifier le max_size() du conteneur avant l'insertion. Ensuite, évitez juste d'utiliser des choses comme at(). Pour encore mieux predicatbilty, utilisez basic_string au lieu de vector. Cela vous oblige à stocker uniquement les types POD, qui ne sont jamais lancés lors de la copie ou de la construction par défaut. De plus, les besoins en mémoire sont plus faciles à calculer.

Une autre approche consiste à utiliser des conteneurs intrusifs. Ceux-ci ne jettent pas (en dehors de l'abus de l'interface peut-être), puisqu'ils n'acquièrent jamais la mémoire en premier lieu.

5

Une ancienne version de stlport peut être configurée pour ne pas utiliser d'exceptions. Ceci est évidemment non-standard mais satisfait votre condition.