Проблемы, которые могут возникнуть при обработке исключений - PullRequest
2 голосов
/ 15 декабря 2010

Этот вопрос вдохновлен этим сообщением: причина утечки памяти в C C ++

Каковы другие виды проблем, которые могут возникнуть из-за использования исключений?

Я имею в виду, какие проблемы мы должны учитывать при обработке исключений

Ответы [ 3 ]

4 голосов
/ 15 декабря 2010

Фактически любой алгоритм может выйти из строя, если возникнет непредвиденное исключение.

Например, алгоритм должен выполнить два действия последовательно, а второе действие приведет к исключению - первое не отменяется (если вы непозаботьтесь об этом) и программа сейчас находится в противоречивом состоянии.В ситуации, с которой вы столкнулись с несоответствием, возникает утечка памяти - код предназначен для освобождения памяти, но код освобождения не был запущен из-за исключения.

Решение состоит в том, чтобы ожидатьисключения и использовать RAII для управления ресурсами и состояниями согласованности.Например, если вам нужно выполнить два действия, вы сначала создаете экземпляр «скобочного класса» в стеке, а после выполнения второго действия вы запускаете специальный метод для этого экземпляра, который означает, что оба действия были выполнены успешно.Если выдается исключение, деструктор этого класса откатит первое действие.

2 голосов
/ 15 декабря 2010

Бьярне Страуструп сделал доступной главу о безопасности исключений ( Язык программирования C ++, 3-е изд .).

Кроме того, вы должны убедиться, что исключенияпрерывание ваших функций в середине звонка будет безвредным.Например, если вы используете RAII (общепринятый подход) для автоматического освобождения мьютексов, вы можете получить на полпути атомарную операцию (деньги сняты с банковского счета 1), сгенерировать исключение и оставить систему в неподходящем состоянии (деньги невсе же хранится на банковском счете 2).

В несколько классической статье ScopeGuard имеется дополнительная информация.

0 голосов
/ 15 декабря 2010

Во-первых, вопрос об утечке памяти, на который вы ссылаетесь, не связан с обработкой исключений как таковых, это просто вопрос не обработки всех способов, которыми может быть обойден какой-то код, который вы хотите запустить.Это было бы одинаково применимо для return, exit(), break или if, которые обошли некоторый код очистки и т. Д. - это менее очевидно с исключениями.RAII является нормальным способом обработки этого класса ошибок (хотя exit() предотвращает запуск деструкторов некоторых объектов).

Re исключения:

  • их можно оставить необработанными, что приведет кзавершение программы
  • они могут быть перехвачены не в том месте, что приводит к неправильной обработке и возможному непреднамеренному поведению
  • classic boost :: shared_ptr <> ошибка: f(shared_ptr<int>(new int(2)), g());, где g () может выдатьМожет произойти утечка памяти
  • Спецификации исключений, как правило, дискредитированы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...