-fno-exceptions
в GCC, или /EHs-
в Visual Studio). Однако, отключение обработки исключений вовсе не означает, что программа не будет генерировать исключения. Это всего лишь означает, что компилятор не будет создавать код для обработки исключений и уничтожения автоматических объектов. А исключения будут продолжать генерироваться — операторами new
при нехватке памяти, методом at()
класса std::vector
при выходе за пределы массива, просто операторами throw
расставленными программистом по своему коду terminate()
.Классы стандартной библиотеки сообщают об ошибках только с помощью исключений и никак иначе. Проблема использования STL в том, что когда мы отключаем поддержку исключений в проекте, то лишаемся механизма обработки ошибок. И если проблему с оператором
new
можно решить его заменой на new (nothrow)
, то исключение, генерируемое в аллокаторе при вызове vector::resize()
, вроде как ничем не заменишь.Иногда возникают ситуации, когда поддержку исключений в проекте просто необходимо отключить, например, если нужно портировать уже написанный код, использующий STL, для платформы, не поддерживающей исключения? Как тут быть?
Я обнаружил, что в зависимости от условий разработки и требований к продукту возможны всего три варианта:
- Оценить вероятность и последствия возможных ошибок, понять, что не всё так страшно, и вообще забить на исключения. В этом случае возникновение ошибок просто напросто приведет к завершению программы.
- Использовать нестандартные (третьесторонние) имплементации для обработки ошибок или средства самой платформы. Как правило, получаются корректные, но не портируемые решения.
- Использовать сложный, но портируемый способ — отказаться от операторов, алгоритмов и классов, генерирующих исключения. Например, использовать
new (nothrow)
вместоnew
, имплементировать аллокаторы со статически зарезервированными блоками памяти, при работе с контейнерами проверять состояние аллокаторов до вызова методов, которые могут вызватьallocate()
, не использовать методы, вродеvector::at()
и т. д.
Есть ещё один вариант - вынести работу с STL в отдельную динамически подгружаемую библиотеку, спрятав все детали реализации под интерфейс.
ОтветитьУдалитьЕсли возникнет нужда/найдутся альтернативы - переписываем с STL на иные конструкции (либо как вы описали в посте) и втягиваем в проект статической либой