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

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

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 239 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 2392019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

[За] Конструкторы особенны тем, что при генерации в них исключения не оставляют после себя объектов для последующего уничтожения. Соответственно, перед генерацией исключения мы не должны устанавливать инвариант, но обязаны убедиться, что освободили все ресурсы, захваченные в ходе неудавшегося создания. [Зб] Деструкторы особенны тем, что сгенерированное в них исключение почти всегда ведет к нарушению инвариантов и/или вызову 1егтгпа1е[].

Следовать этим правилам на практике может оказаться неожиданно трудно. Основная причина в том, что исключения иногда генерируются там, откуда их никто не ждет. Хороший пример — зЫсЬас( айос. Каждая функция, которая прямо или косвенно использует петю пли айоса1от для выделения памяти, может сгенерировать Ьас( айос. В некоторых программах мы можем решить эту частную проблему, не исчерпывая памяти. Однако в случае программ, которые рассчитаны на длительную непрерывную работу илп иа произвольный объем входных данных, мы должны быть го~овы к обработке самых разнообразных отказов при запросе ресурсов.

Таким образом, каждую функцию следует подозревать в способности сгенерировать исключение, пока нс доказано обратное, Простой способ попытаться избежать неожиданностей состоит в использовании контейнеров элементов, которые не генерируют исключений (типа контейнеров указателей и контейнеров простых конкретных типов), или связных контейнеров (например йз1), которые обеспечивасот сильную гарантию Я ДА). Другой (дополняюгцпй) подход — положиться прежде всего на операции вроде ризЛ Ьасй[], которые предоставляют сильную гарантию, так что операция либо успешно заканчивается, либо ни на что не влияет ЯД,2).

Олнако сами по себе эти подходы недостаточны для предотвращения утечек ресурсов; они могут привести к очень специальному. чрезмерно осраничительному и пессимистическому методу обработки ошибок и восстановления. Например пес1ог<Т*> — тривиально безопасный при исключениях тип, если операции с Тле генерируют исключений. Однако если указываемые обьекты нигде пс удаляются, исключение из пес1ог приведет к утечке ресурсов. Введение вспомогательного класса Напгйе для освобождения ресурсов (Э 25.7) и применение оес1ог<НапЖе<Т» вместо иес1ог<Т*>, вероятно, улучшит жизнеспособность кода. Д.б.

Значенив для пользователей библиотеки 1051 При написании нового кода можно принять более систематический подход и добиться, чтобы каждый ресурс представлялся классом с инвариантом, обеспечивающим основную гарантию (б Д.2). Такой подход позволяет выделить наиболее важные объекты приложения и обеспечить семантику отката для операций с ними (то есть сильную гарантию — возможно, при каких-то условиях). Ьольшинство приложений содержат структуры данных и код, которые написаны без учета безопасности исключений. Где необходимо, такой код может быть встроен в безопасную при исключениях среду либо после проверки, что он не генерирует исключений (как стандартная библиотека Си; ~ Д.5,5), либо с помощью интерфейсных классов, для которых поведение при исключениях и управление ресурсами может быть точно определено.

При проектировании типов, предназначенных для использования в безопасной при исключениях среде, следует обратить особое внимание на операции, используемые стандартной библиотекои: конструкторы, деструкторы, присваивания, сравнения, функции перестановки, предикаты и операции на итераторах. Наилучшее решение состоит в определении инварианта класса„который просто устанавливается всеми конструкторами.

Иногда необходимо проектировать инвариант класса так, чтобы можно было перевести объект в состояние, в котором он может быть уничтожен, даже если операция терпит неудачу в «неудобной» точке. В идеале такое состояние не является артефактом, введенным для поддержки обработки исключений, а естественным образом вытекает из семантики типа (б Д.3.5). При рассмотрении безопасности исключений акцент должен делаться на определении действительных состояний для объектов (инвариантов) и на надлежащем освобождении ресурсов.

Поэтому важно представлять ресурсы как классы. Класс вес1ог базе ЯД.З.2) — простой тому пример. Конструкторы таких «ресурсных» классов захватывают ресурсы нижнего уровня (типа необработанной памяти для иесгог Ьазе) н устанавливают инварианты (скажем, наллежащим образом инициализируют указатели эес1ог базе).

Деструкторы подобных классов неявно освобождают ресурсы нижнего уровня. Правила для частичного создания (б 14.4.1) и методика «выделение ресурса есть инициализация» (б 14А) поддерживают этот путь управления ресурсами. Хорошо написанный конструктор устанавливает инвариант класса для объекта (б 243.7.1). То есть конструктор присваивает объекту значение, которое делает написание последующих операций простым делом и позволяет этим операпиям успешно завершаться, Тем самым предполагается, что конструктору часто приходится захватывать ресурсы. Если сделать этого не улается, конструктор может сгенерировать исключение, чтобы мы могли заняться проблемой еще до создания объекта.

Такой подход непосредственно поддерживается языком и стандартной библиотекой (б Д.З.5). Требование освободить ресурсы и поместить операнд в действительное состояние перед генерацией исключения означает, что бремя обработки исключеннй разделяется между генерирующей функцией, всеми функциями в цепочке вызовов до обработчика и обработчиком. Генерация исключения не делает обработку ошибки «не моей проблемой». Функции, генерирующие пли передающие исключения, обязаны освободить ресурсы, которыми владеют, и поместить операнды в непротиворечивые состояния. Если они этого не делают, обработчик исключений может разве что попробовать изящно завершить программу.

Приложение Д. Безопасность исключений и стандартная библиотека 1052 Д.7. Советы (1) Определитесь со степенью безопасности исключений, которая вам нужна; 9 Д2. [2] Безопасность исключений должна быть частью общей стратегии отказоустойчивости; З Д.2. (3] Обеспечьте основную гарантию для всех классов, то есть соблюдайте инвари. ант и не допускайте утечек ресурсов; в Д.2. х Д.3.2, й ДА.

(4] Где возможно и не слишком накладно, обеспечьте сильную гарантию, чтобы операция либо успешно завершалась, либо оставляла все операнды неизменными; й Д.2, 9 Д.З. [5( Ие генерируйте исключений в деструкторах; ~ Д.2, ~ Д.3.2, з ДА. (6] !!е генсрируйтс исключений в итераторах, продвигающихся по действительной последовательности; З ДА.1, з ДА.4. (7) Безопасность исключений требует тщательного исследования отдельных операций; 6 7!.3. (8] Разрабатывайте шаблоны прозрачными к исключениям; 9 Д.З.1.

[9] Отдавайте преимушество «конструкторному подходу» к запросу ресурсов по сравнению с использованием функции (п(1(); ~ Д.З.5. [10) Определяйте инвариант для класса, чтобы было ясно, что является действительным состоянием; 9 Д.2, ~ Д.6. (11] Удостоверьтесь, что объект всегда может быть помещен в действительное состояние без риска генерации исключения; 9 Д.З.2, 5 Д.б. [12) Придерживайтесь простых инвариантов: 9 Д.3.5. [13) Перед генерацией исключения оставляйте все операнды в действительных состояниях; 9 Д.2, (] Д.6. (14] Избегайте утечек ресурсов; 9 Д.2, 6 Д.3.1, 9 Д.б.

(15] Г!редставляйте ресурсы непосредственно; 6 Д.3.2, 5 Д.6. [16) Помните, что зщар() может иногда быть альтернативой копированию злементов; (] Д.З.З. [17] Где возможно, полагайтесь на упорядочение операций, а не на явное использованиее 1гу-блоков; (] Д.3.4. (18] Пе уничтожайте «старую» информацию, пока не будет благополучно произведена ее замена; й Д.З.З, й Д.6. (19] Полагайтесь на методику «выделение ресурса есть инициализация»; 6 Д.З, 6 Д.3.2, б Д.6. (20] Удостоверьтесь, что операции сравнения для ассоциативных контейнеров могут копироваться; й Д.З.З.

(21] Выделяйте наиболее важные структуры данных и предоставляйте для них операции, которые обеспечивают сильную гарантию; ~ Д.6 Д.8. Упражнения 1.(*1) Перечислите все исклюния, которые могли бы сгенерироваться в )() из з Д.1. 2. (*1) Ответьте па вопросы после примера из 9 Д.1. 3 (*1) Определите класс Тев1ег который иногда генерирует исключения в основных операциях, например в копируюп1ем конструкторе.

С помощью Тез1ег проверьте контейнеоы вашей станлаотной библиотеки. Д.8. Упражнения 1083 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. (*1) Найдите ошибку в анеряшливой» версии конструктора пес!ог (8 Д.3.1) и напишите программу, вызывающую его крах. Подсказка: сначала реализуйте деструктор пес!ог. ('2) Реализуйте простой список, обеспечивающий основную гарантию. Будьте очень конкретны относительно того, что требует список от своих пользователей, чтобы обеспечить гарантию. (*3) Реализуйте простой список, обеспечивающий сильную гарантию. Тшательно проверьте этот список.

Обоснуйте, почему люди должнгя верить, что он будет беаопасным. (*2.5) Еще раз реализуйте 5!г!пд из 8 11Л2, чтобы он был столь же безопасным, как стандартный контейнер. (*2) Сравните время выполнения различных версий присваивания пес!ог и яауе азз1йп() Я Д.З.З). (*1.5) Скопируйте распределитель памяти без использования оператора присваивания (как зто необходимо для улучшения орега!ог-() в 8 ДЗЗ).

(*2) Добавьте к пес!ог функции егазе() и !пяег!(), удаляюшие/вставлякпцие один или нескольких элементов, которые обеспечивают основную гарантию (9 Д.3.2). (*2) Добавьте к пес!ог функции егазе() и !пяег!(), удаляюшие/вставляюшие один или нескольких элементов, которые обеспечивают сильную гарантию (8 Д.З.2). Сравните стоимость и сложность этих решений и решений из упражнения 10.

(*2) Напишите зауе !пзег!() (8 Д.4.2), которая вставляет элементы в существующий пес!ог (а не копирует во временную переменную). Какие ограничения придется наложить на операции? (*2) Напишите яа~е 1пзег!() (9 Д.4.2), которая вставляет элементы в существующий гоар (а не копирует во временную переменную). Какие ограничения прилстся наложить на операции? ('2.5) Сравните размер, сложность и производительность функций ваге !пяег!() из упражнений 12 и 13 с за)е !пяег!() из 8 ДА.2.

(*2.5) Напишите лучший (более простой и быстрый) яа)е !пяег!() только для ассоциативных контейнеров. С помощью свойств (тгайя) напишите яа!е !пзег!(), который автоматически выбирает оптимальный яа~е 1пяег!() для контейнера. Подсказка: я 19.2.3. ("2.5) Попробуйте переписать ип!и!!!а1!вес( !711() Я 19АА, б Д.3.1) так, чтобы он справлялся с деструкторами, которые генерируют исключения. Это возможно? Если да, какова стоимость? Если нет, почему? (*2.5) Попробуйте переписать ип1п!!1а!!вес! ~1!!() (8 19.4.4, () Д.3.1) так, чтобы он справлялся с итераторами, которые генерируют исключения для ++ и —.

Это возможно? Если да, какова стоимость? Если нет, почему? (*3) Выберите библиотечный контейнер, но нс из стандартной библиотеки. Ознакомьтесь с его документацией и выясните, какие гарантии безопасности исключений он обеспечивает. Проделайте несколько испытаний, чтобы увидеть, насколько он устойчив при исключениях, сгенерированных распределением памяти н предоставленным пользователем кодом. Сравните с соответствующим контейнером стандартной библиотеки.

(*3) Попробуйте оптимизировать пес!ог нз б Д.З, пренебрегая возможностью исключений. Например, удалите все !гд-блоки. Сравните производительность 1054 Приложение Д. Безопасность исключений и стандартная библиотека с версией из з Д.З и с реализацией пес1ог из стандартной библиотеки. Сравните также размер и сложность исходного кода зтих различных векторов. 20.

(*1) Определите инварианты для пес1ог (ч Д.З) с возможностью и == 0 и без нес (З Д.З.5). 21. ("2.5) Прочитайте исходный текст реализации иес1ог. Какие гарантии осупгествлены для присваивания, многоэлементный (лвег1)) и гезеае))? 22. ('3) Напишите версию Лаза тар Я 17.6) столь же безопасную, как стандартный контейнер. .

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

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

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

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