Обработка ошибок STL без исключений - PullRequest
8 голосов
/ 06 октября 2010

У меня есть проект, который часто использует STL. Сейчас я работаю над переносом проекта на конкретную платформу, которая не поддерживает исключения. Я могу отключить исключения, однако мне все еще нужно обрабатывать ошибки STL.

Есть ли подход для правильной обработки ошибок STL с отключенными исключениями? Есть ли какая-либо сторонняя реализация STL, которая помогает с этим?

Ответы [ 2 ]

7 голосов
/ 07 октября 2010

Проблема с получением существующего coontainer библиотеки std и компиляцией с отключенными исключениями состоит в том, что сами интерфейсы контейнера std предполагают, что исключения включены.Используя исключения, оператор new сгенерирует, если он не сможет получить память, без исключений оператор new вместо этого возвратит 0, что не может обрабатывать контейнеры std.

Один из подходов - использовать только алгоритмы STL + вектор.Вы можете скопировать около 95% того, что делают другие контейнеры, используя это.Проблема состоит в том, что большинство реализаций STL предполагают, что

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

никогда не будет утверждаться (так как резерв будет выбрасывать, если нет памяти).Чтобы это никогда не возникало, я использовал контейнеры с «фиксированной емкостью», то есть контейнеры с емкостью, фиксированной во время компиляции.В основном это векторы, где я передаю специальный распределитель.Затем вы можете проверить max_size () контейнера перед вставкой.Тогда просто избегайте использования таких вещей, как at ().Для еще большей предсказуемости используйте basic_string вместо vector.Это заставляет вас хранить только те типы POD, которые никогда не генерируются при копировании или создании по умолчанию.Кроме того, требования к памяти легче вычислить.

Другой подход заключается в использовании навязчивых контейнеров.Они не генерируют (возможно, за пределами неправильного использования интерфейса), так как они никогда не получают память в первую очередь.

5 голосов
/ 06 октября 2010

Возможно, старая версия stlport может быть настроена на использование исключений. Это, очевидно, нестандартно, но удовлетворяет вашим требованиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...