Главная » Просмотр файлов » Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 239

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 239 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 2392018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 239)

И это никакая не уникальная особенность контейнеров. Любой объект, оставленный в плохом состоянии, может впоследствии вызвать сбой программы. Приложение Е Исключения и безопасность стандартной библиотеки 1108 но это будет набор действительных элементов. Например, если операция сравнения == сгенерирует исключение, будучи вызванной из!ВГ:: иящие1) (Э!7 2 2 3), пользователь не сможет твердо рассчитывать на отсутствие дубликатов в списке. Он может рассчитывать лишь на то, что каждый элемент в списке является действительным (см.

ЯЕ.5.3). По счастью, предикаты редко делают что-нибудь, что может генерировать исключение. Однако пользовательские предикаты <, == и . '= все же нужно принимать во внимание при рассмотрении вопросов, связанных с безопасностью кода при исключениях. Объект сравнения ассоциативного контейнера копируется в процессе выполнения операции анар() (эЕ.4.3). Поэтому имеет смысл позаботиться о том, чтобы копирующие операции предикатов, которые могут использоваться в качестве объектов сравнения, не генерировали бы исключений.

Е.5. Другие части стандартной библиотеки Главная задача в контексте безопасности исключений — это поддержание согласованности объектов; то есть нужно не только поддерживать инварианты индивидуальных объектов, но и согласовывать их между собой. С точки зрения стандартной библиотеки наибольшую трудность в деле обеспечения безопасности исключений представляют собой объекты-контейнеры, а остальная часть библиотеки менее интересна в этом отношении. В то же время, и встроенные массивы являются контейнерами, которые могут быть испорчены какими-либо опасными операциями. В общем случае, функции стандартной библиотеки генерируют только те исключения, которые включены в их спецификацию, плюс исключения, которые генерируются при этом вызываемыми пользовательскими операциями. Кроме того, все функции, которые прямо или косвенно выделяют память, могут генерировать исключение, свидетельствующее об исчерпании памяти (как правило, мА:: ЬаЫ а1!ос).

Е.5.1. Строки Операции над строками могут генерировать множество разных исключений. Однако Ьаяс зптяя манипулирует символами посредством функций, предоставляемых сЬаг гга(о (820.2), а этим функциям запрешено генерировать исключения. Подчеркнем, что именно функции сйаг и аггз из стандартной библиотеки не генерируют исключений, в то время как пользовательские сйаг гга(в могут и не соблюдать этого соглашения.

Обратите также внимание на то, что типу, который используется в качестве символьного типа (типа элементов) для Ьаз)с зп )пя, запрешено иметь определяемые пользователем операции копирования. Тем самым устраняется важный потенциальный источник исключений. Тип Ьаяс язтая во многих отношениях похож на стандартньш контейнер (817.5, $20.3). Его элементы фактически составляют последовательность, к которой можно обрашаться с помошью Ьаяс зязяя< СЬ, Тг, А>:: Ьегяазг и Ьяяс изтяя< Суг, Тг, А>:: сопзг )гегягег.

Соответственно, реализация строк стандартной библиотеки предоставляет базовую гарантию(5Е 2), а гарантии для егязе(), ицегг11,рий Ьасй(1 изнар() (Е4.1) распространяются и на Ьаяс ига. Например, Ьязгс мзтщ<суь ЛЬ,А>::7зизЬ ЬасЬ1) обеспечивает сильную гаранппо. Е 5. Другие части стандартной библиотеки 1109 Е.5.2. Потоки Когда нужно, функции типа тоетгеатп генерируют исключения, чтобы сообщить об изменениях состояния (82!.3.6). Соответствующая семантика хорошо определена и не создает проблем по части безопасности исключений. Если же пользовательские орегагог«< () или орегагог»> () генерируют исключения, то это может выглядеть так, что исключения сгенерировала библиотека.

Такие исключения, однако, не влияют на состояние потока (821.3.3). Дальнейшие операции потока может быть и не найдут ожидаемых данных — из-за того, что предшествовавшая операция вместо нормального завершения сгенерировала исключение — но сам по себе поток не поврежден. Как всегда при возникновении проблем ввода/вывода, перед возобновлением чтения или записи может потребоваться вызов функции с(еаг() 62 1.3.3, 82 1.3.5). Подобно Ьаз(с зтп8, потоки (оетгеат в своих манипуляциях с символами полагаются на сйаг тга!в 620.2.1, 8Е.5.1). Таким образом, реализация может полагаться на то, что операции с символами не генерируют исключений, но не дается никаких гарантий в отношении нарушения этих соглашений пользователем.

Ради возможности серьезной оптимизации делается предположение, что классы (осате (81).2) и уасет (8)3.3) не генерируют исключений. Если бы они генерировали исключения, то использующий их поток мог бы быть испорчен. Наиболее вероятное исключение, ага:: Ьаа сазг, может генерироваться в рамках пользовательского кола вне реализации стандартных потоков. В самом худшем случае это может привести к неполному выводу или к неудачному чтению, но не к повреждению потока озтгеатп (или мтгеат).

Е.5.3. Алгоритмы Кроме пп(п!Иайхей Яй(), ппиийайгеп йй и() и пп(п(йайееа' сору() (8Е.4.4), по стандарту для алгоритмов предлагается лишь базовая гарантия (8Е.2). То есть в случае корректного поведения пользовательских объектов стандартные алгоритмы соблюдают все инварианты стандартной библиотеки и не порождают утечку ресурсов. Во избежание неопределенного поведения пользовательские операции всегда должны оставлять свои операнды в действительных состояниях, а деструкторы не должны генерировать исключений. Сами алгоритмы не генерируют исключений.

Вместо этого они сообщают об ошибках через свои возвращаемые значения. Например, поисковые алгоритмы в качестве сообщения «не найдено» обычно возвращают ссылку на конец последовательности (418.2). Таким образом, исключения, сгенерированные в процессе работы стандартных алгоритмов, на самом деле генерируются пользовательскими операциями. Исключения эти возникают в таких операциях на элементах, как предикаты (818.4), присваивания или авар (), а также в аллокаторах (919.4). Если перечисленные операции генерируют исключение, то алгоритм немедленно завершает работу, а дальнейшие решения по обработке исключения остаются за функциями, вызвавшими алгоритм.

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

Обратим внимание на то, что стандартные алгоритмы обращаются к последовательностям через итераторы. Таким образом, стандартные алгоритмы не работают с контейнерами напрямую, а работают лишь с их элементами. Тот факт, что стандартные алгоритмы никогда непосредственно не добавляют и не удаляют элементы контейнеров, упрощает анализ последствий исключения. Аналогичным образом, если к некоторой структуре данных обращаются лишь через итераторы, указатели или ссылки на константы (например, с помощью соязг пес*), то легко доказать, что исключения в этом случае не приводят к нежелательным последствиям. Е.5.4.

Типы ча(аггау и солар!ех Числовые функции не генерируют исключений явным образом (глава 22). В то же время, та1аггау должен распределять память, что может привести к исключению зттй:Ьай ааоц Кроме того, шаблонам га!аггау и сотр!ех можно передать тип элементов (скалярный тип), который в общем случае генерирует исключения. Как всегда, стандартная библиотека предоставляет базовую гарантию (зЕ.2), но никаких специальных гарантий относительно результатов вычислений, прерванных исключением, не дается. Подобно Ьаяс зтг)яя (ЗЕ.5.1) типы га1аггау и сотр!ех полагаются на то, что пользовательским типам их аргументов запрещено явным образом определять копирующие операции, так что их копирование побитовое.

Как правило, эти числовые типы стандартной библиотеки оптимизированы по быстродействию в предположении, что типы их элементов (скалярные типы) не генерируют исключений. Е.5.5. Стандартная библиотека языка С Генерирует ли исключения операция стандартной библиотеки, не имеющая спецификации исключений, или не генерирует, зависит от конкретной реализации. Функции стандартной библиотеки языка С не уполномочены генерировать исключения по определению (в языке С нет исключений), но это могут делать их аргументы-функции.

Реализации часто объявляют стандартные библиотечные функции языка С с пустой спецификацией исключений гйгом() с целью помочь компилятору в их оптимизации. Функции типа озогг(1 и Ьзеагсй(1 8!8.11) принимают в качестве аргументауказатель на функцию. Поэтому они могут сгенерировать исключение, если зто делают их аргументы. Базовая гарантия (зЕ.2) распространяется и на эти функции, Е.б. Рекомендации пользователям стандартной библиотеки Можно глядеть на безопасность исключений в контексте стандартной библиотеки таким образом, что все проблемы мы создаем себе сами.

Характеристики

Тип файла
DJVU-файл
Размер
8,84 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6480
Авторов
на СтудИзбе
303
Средний доход
с одного платного файла
Обучение Подробнее