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.