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

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

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

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

Безопасность исключений и стандартная библиотека 1024 иес1ог)сопя! иеИоге, а); //копирующийконструктор оес1огйорега1ог=(сопя1иес1огс а); //копируюсцее присваивание -иес1ог)); Иге 1уре з!ее)) сопя1 ! ге1игп эросе — о; ) я!ее 1уре сарасйу)) сопя! ! ге1игп !аз1 — о; ) оо!с! рияб бас/с)сопя! Тв) Рассмотрим сначала наивную реализацию конструктора: солИ Тй оа1, сопя!Аз а) // предупреждение: наивная реализация // копирование распределителя памяти 1етр!а1е<с!азя Т, с!аяз А> иес1ог Т,А>эоес1ог)з!яе 1уре и а!!ос(а) ( о = а!!ос.а!!оса1е(п); эрисе = !аИ = о+ и; /ог )Т' р = о; р!= 1аз1; ээр) // получение памяти для элементов !9 ! 9.4.

!) а!!ос.сопя!гас!)р, оа!); // соэдание копии са! в *р // !9 !9.4.!) 1етр!а1е~с!азз Т, с!аязА> иес1огсТ А>сиесго>)я!ее 1уре и, сопя! ТЬ оа1, сопя!Ай а) // усовершенствовинная реализация яти : а1!ос )а) // копирование распределителя пам о = а11ос.а!1оса1е(п); // получение памяти для элементов 11ега1ог р; 1гу ( !1ега1огелэ! и+ и; /ог)р = о; р!= епс!; >4р) а!!оссопя1гисур, оа!); //соэдиние элел~ента // !9 !9.4.!) Здесь имеются три источника исключений: [1) а11оса1е)) генерирует исключение, указывающее, что пет доступной памяти; 12) копирующий конструктор распределителя памяти генерирует исключение; '13) копирузощий конструктор для элемента типа Т генерирует исключение, потому что не может скопировать оаб Во всех случаях никакого объекта не создается, так что деструктор оес1ог не вызывается Я 14.4А), Когда а1!оса1е() терпит неудачу, 1/сгото завершит выполнение прежде чем будут выделены какие-либо ресурсы, так что все хорошо.

Когда копирующий конструктор Т терпит неудачу, нами уже была оприходована некоторая память, которую следует освободить, чтобы избежать утечки. Более серьезная трудность состоит в том, что копирующий конструктор для Т мог бы сгенерировать исключение после правильного создания нескольких элементов, но перед созданием их всех. Чтобы справиться с затруднением, мы могли бы отследить, какие элементы были созданы, и уничтожить их (и только их) в случае ошибки: 1025 Д.З. Безопасные при исключениях методы реализации 1ак! = красе = р; са1сИ(..) ( /ог(!1ега1ог д = тв у!= р; ч->у) а1!оас/екггоу(у)' // уничтожение соэданньх // элементов // освобождение памяти // повторная генерация // исключения а!!оас!еа1!оса!в(и, л); 1И гики гетр!а!в«с!акк Рог, с1акк Т> вой! ил!л!!!а1!хес! /г11(Рог Ьед, Рог еш1, свай! Ть х) ( Рог р; 1гу ( /ог(р = Ьед; р ы еп!1;.и-р) лето (к!аг!с как!«иои!*> (сер)) Т(х) //соэдание копнил в 'р !у !04.! !) са1сИ (...) ( // уничтожение созданных элементов // и повторная генерация исключения // Цу !0.4.!!) 3ог (Рог д = Ьерб д )= ргн.у) (Г.*д) — >-7(); !Иго!в, Любопытная конструкция 8'р «присматривает» за итераторами, которые не являются указателями, В этом случае мы берем адрес разыменованного элемента, чтобы получить указатель.

Явное приведение к ооЫ* гарантирует, что используется стандартная библиотечная функция размещения !Г! 19А.5), а не определенный пользователем орега1ог леш() для Т*. Этот код работает ца довольно низком уровне, где написание действительно общего кода может быть затруднено. К счастью, мы не должны повторно реализовывать ип!п!!!а!!вес//1 11(), потому что стандартная библиотека обеспечивает для нее желанную сильную гарантию (ф Д.2). Зачастую важно, чтобы операции инициализации либо завершались успешно, проинициализировав каждый элемент, либо терпели неудачу, не оставляя после себя созданных алементов. Вот почему алгоритмы ил!л!1!а!!хе!1 /с!!(), ип/л!!/а!!хес! !!11 п(), и ил!а!1!а!!хек( сору() Ц 19А.4) стандартной библиотеки обеспечивают подобную сильную гарантию безопасности исключений Я Д.4А). Обратите внимание, что алгоритм ил(п111а1!хес! ~!1!() не загпищает от исключений, сгенерированных леструкторами элементов или итераторными операциями Я ДА.4).

Такая защита была бы непозволительно дорогой (см. З Д.8 (16 -17) ). Накладные расходы здесь связаны с 1гу-блоком. В хорошей реализации С+ + эти накладные расходы пренебрежимо малы сравнительно со стоимостью распределения памяти и инициализации элементов. Для реализаций, где вход в 1гу-блок накладен, заслуживает внимания проверка !/'(п) перед !гу и отдельная обработка случая пустого вектора. Основная часть этого конструктора — безопасная при исключениях реализация ап!л!!1а1!хес! !!11() Приложение Д.

Безопасность исключений и стандартная библиотека 1026 Алгоритм ип!п11!аПзеП !111() может применяться ко многим видам последовательностей. Соответственно, он использует однонаправленный итератор Я 19.2.1) и не может гарантировать уничтожение элементов в порядке, обратном их созданию. Используя ип1пШа11зег1 1)11(), мы можем написать: 1етр1а1е<с/авв Т, с!авэ А» оес1ог Т,А>::оес1ог(э!ее 1уре и, сопя! Т8 оа1, сопя! Ав,а) //неряшливая реолиэация : аПос(а) // копирование распределителя памяти ( // получение памяти для элементов о = апас,адоса1е(п); ггд ( итш! 1авзед 3П(о, о + п, оа1); эрисе = 1аэг = и+ и; // копирование элементов са1с/э (...) ( аПос.(еаПоса1е(о, и); Йгогв; ) // освобождение помюпи // повторния генерация исключения Лично я не стал бы вызывать этот славный код.

Следующий раздел продемонстрирует, как существенно упростить его. Заметим что конструктор повторно генерирует перехваченное исключение. Цель понятна — сделать оес1ог прозрачным для исклеочений, чтобы пользователь мог определить истинную причину проблемы. Все контейнеры стандартной библиотеки обладают этим свойством. Прозрачность для исключений — часто наилучшая политика для шаблонов и других чтонких» слоев программного обеспечения. Напротив, главные части системы (чмодули») обязаны, вообще говоря, принимать на себя ответственность за все сгенерированные исключения.

То есть разработчик модуля должен быть готов перечислить все исключения, которые могут генерироваться модулем. Достичь этого можно группировкой исключений (з )4.2), отображением исключений от подпрограмм низшего уровня в собственные исклсочения модуля (5 (4.6.3) или спепификапией исключений (з 14.6).

Д.3.2. Явное представление памяти 1етр1а1е<с/аев Т, с/аээ А = аПоса1огчТ» эггис1 оес1ог Ьаэе ( А аПос; Т" о; Т" эрисе; // распределитель памяти // начало распределения // конец последовательности элементов, начало свободного // пространства, распределенного для возможного расширения Опыт показывает, что написать правильный безопасный при исключениях код с помощью явных гэ!/-блоков гораздо труднее, чем многим кажется.

На самом деле эти трудности не оправданы, потому что имеется альтернатива. Методика евыделение ресурса есть инипиализапия» (9!4А) позволяет уменьшить объем кода и сделать код более элегантным, В данном случае ключевой ресурс, требуемый оес1ог, — память для хранения элементов. Обеспечив дополнительный класс для представления понятия памяти, используемой в оес1ог, мы можем упростить код. При этом мы меньше рискуем случайно забыть об освобождении памяти: !027 Д.З. Безопасные при исключениях методы реализации Т"!ав1; // конку распределенного пространства иес1ог Ьаве(свая!Ай а, 1урвлатеА яте !урел) ауос(а), и(а.а!!оса!к(п)), враке(и+и), 1ав!(о+л) () -оес!вг Ьаве() (айос.деа!!оса!е(и, 1ав1-и); ) Пока о и 1аз1 правильны, оес1ог Ьазе может быть уничтожен. Класс оес1ог базе имеет дело с памятью для типа Т, а не с объектами типа Т.

Следовательно, пользователь оес1ог Ьазе должен уничтожить все объекты, созданные в отведенной оес1ог Ьазе памяти, прежде чем уничтожать сам оес1ог Ьаве. Встественцо, сам оес1ог Ьаяе написан так, что при генерации исключения (копирующим конструктором распределителя памяти или функцией а!!оса1е()) объект оес(ог Ьазе не создастся, и память не теряется. При наличии оес1ог Ьаве, оес1ог может быть определен примерно так: !ею р!а!еле!авв Т, с1авв А = аИоса1огл Т > с(авя иес!вг: рг/ваге иесгог Ьаве<Т, Аь ( ив!ддккггву к/еткп!к()(/ог (Т'р=о р?=враке; нр)р-э-7() красе=и;) //З !04 ! I рибйс екр!!сп иес1ог(в!яе 1уре и, свпв1 Тй иа! = 7)), солв1Ай = А()); иесгог(сопя! иес1огй а); иес1огй орега1ог=(соля! иес1огй а); // копирующий квннпруктор // копирующее присваивание -иес1ог() ( дев!гоу е1етеп1в(); ) в!ее 1уре вике() сопя! ( гв1игп ярасе — га ) к!ке 1уре сарае!1у() сопя! ( ге1игп !ав! — и; ) ооЫ рива ЬасЦсопв1 Тй); 1етр(а1е с1аяв Т, с1аввА> иес!ог Т,А>:.иес!в!(в!ев !урка, сопв1 Тйоа1, сопв1Айа) : вес!ог Ьаяе (а, и) // распределение аростринства длв пэлемен)пов ( ип!а!1!а!/еей Я11(и,о+и, иа/); // копирование элементов Кспируиэщий конструктор отличается использованием ил!л!1!а(!яеа! сору() вместо ип!и!1!а(/гег/ /!Е!() Деструктор оес1ог явно вызывает для каждого элемента деструктор Т.

Значит, если деструктор элемента генерирует исключение, уничтожение объекта оес1ог терпит неудачу. Это может оказаться бедствием, если случится в ходе раскрутки стека, вызванной исключением; все закончится обращением к 1егт!ла1е() Я 14.7). В случае нормального уничтожения объекта генерация исключения из деструктора обычно ведет к утечке ресурсов и к непредсказуемому поведению кода, полагающегося на разумнсс поведение объектов. Не существует действенной защиты от исклвочений, сгенерированных деструкторами, так что библиотека не дает никаких гарантий, если деструктор элемента генерирует исключение Ц Д.4). Теперь конструктор может быть определен просто: Приложение Д. Безопасность исключений и стандартная библиотека 1028 Отметим, что такой стиль конструктора полагается на фундаментальное правило языка: если исключение сгенерировано в конструкторе, полностью созданные подобъекты (такие как члены базового класса) будут должным образом уничтожены (8 14 4.1).

Алгоритм ил!и!1!а!!яес! /с!!() и его собратья Я Д 4А) обеспечивают эквивалентную гарантию для частично созданных последовательностей. Д.З.З. Г(рисваивание Как обычно, присваивание отличается от создания тем, что нужно позаботиться о старом значении. Рассмотрим прямолинейную реализацию; 1етр!а1е<с!ияя Т, с!аяяА> иес1ог<Т,А>й иемог<Т А>эорега1ог=(солвгиес1огйа) // освобождение старой памяти // инсталляниэ нового представления // предотвраи1ение освобождения Такое симпатичное присваивание безопасно при исключениях. Однако оно повторя- ет много кода из конструкторов и деструкторов.

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

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

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

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