Главная » Просмотр файлов » А. Александреску - Современное проектирование на C++

А. Александреску - Современное проектирование на C++ (1119444), страница 37

Файл №1119444 А. Александреску - Современное проектирование на C++ (А. Александреску - Современное проектирование на C++) 37 страницаА. Александреску - Современное проектирование на C++ (1119444) страница 372019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

5)пд1етоп зпеайу(ч5!пд1етоп::?пзтапсеО); // ошибка! // не позволяет создать копию впеаку объекта класса 5з'пд1етоп, // возвращаемого функцией-членом тпвтапсе Если не определить конструктор копирования, компилятор сам создаст открытый конструктор (Меуегз, )99Ва). Объявление явного конструктора копирования блокирует автоматическую генерацию, и размешение конструктора в разделе рг1чате вызовет ошибку на этапе компиляции, Ситуацию можно немного исправить, если позволить функции-члену тпзтапсе возврашать ссылку, а не указатель. Проблема, связанная с указателем, возврашаемым функцией-членом Хпзтапсе, заключается в том, что вызываюший код может попы- таться удалить его с помошью оператора де1ете.'Для того чтобы минимизировать ве- роятность этого события, безопаснее возврашать ссылку.

// внутри класса 5(пд1етоп зтат)с 5(пд1етопе !пзтапсеО; Другая функция-член, генерируемая компилятором по умолчанию, представляет собой оператор присваивания. Уникальность объекта не связана с оператором при- сваивания непосредственно, однако одно из ее очевидных последствий заключается в том, что присваивать один объект другому нельзя, поскольку два объекта класса 5)п- 91етоп одновременно сушествовать не могут, Для объекта класса 5(пд1есоп любое присваивание оказывается самоприсваиванием (зе((-азз)йпшеп!), не имеюшим ника- кого смысла. Следовательно, слелует заблокировать оператор присваивания (сделав его закрытым и никогда не реализуя).

Часть й. Компоненты 154 Последний уровень зашиты создается закрытым деструктором. Эта мера предотвращает случайНОЕ Удаление указателя на объект класса 51пд1етоп. Таким образом, интерфейс класса 51пд1егоп принимает следующий вид. с1азз 51пд1етоп 5зпд1етопй хпзтапсеО; ... операции рг(часе: 51 пд! е гоп О; 5зпд1етоп(сонат 5зпд1етопб); 5зпд1етопй орегатог=(сопэт 51пд1 етопй); -51пд1етопО; ) 6А. Разрушение обьектов класса 81пя!европ Как указывалось выше, объекты класса 51пд1етоп созлаются по требованию при первом вызове функции-члена Хпзтапсе, который определяет момент создания, но оставляет открытым вопрос об удалении объекта.

Когда слелует удалять созданный экземпляр, в книге Оапппа е! а1, (1995) не указано„однако, по свидетельству Джона Влиссидеса (Раггегн Нагой(н8, !998), это трудная задача. Действительно, если объект класса 5(пд1егоп не удален, то это не означает утечки памяти (гпегпогу 1еай). Подобная проблема возникает, когда в памяти накапливаются данные, ссылки на которые утеряиы. Ситуация, связанная с объектом класса 5)пд1етоп, совершенно иная. Здесь ничего не накапливается, и адрес объекта известен до самого конца работы приложения. Более того, все современные операционные силемы сами выполняют полную очистку памяти при завершении программы. (Интересное обсуждение проблемы, что считать, а что не считать утечкой памяти, проведено в книге ЕХ)есг!че С++ (Меуегз, 1998а).) Однако утечка памяти все же имеет место, более того, происходит скрытая утечка ресурсов (!пз!д!оцз геаошзе 1еак).

Конструктор класса 51пд1есоп может запросить неограниченное количество ресурсов: сетевые соединения, обработку системных мьютексов (ОЯ-ччи)е гаи!ехез) и другие внугрипроцессные средства связи, ссылки на внепроцессные (оцг-орргбсеьз) СОВВА- или СОМ-объекты и т.п. Единственный способ избежать утечки ресурсов — удалить объект класса 51пд1етоп в момент завершения работы приложения. Вопрос заключается в том, как выбрать правильный момент для удаления объекта, чтобы не возникло обрашения к уже удаленному объекту. Проше всего при удалении синглтона положиться на языковые механизмы. Например, приведенный ниже код демонстрирует другой подход к реализации синглтона.

Вместо размещения объекта в динамической памяти и применения статического указателя, функция хпзтапсе использует локальную статическую неременную (!оса! Маг!с чапаЫе). 5зпд1етопй 5хпд1етоп::хпагапсеО ( зтат1с 5тпд1етоп оЬ); гетигп оЬ); Эта простая и элегантная реализация была впервые опубликована Скоттом Мейерсом (Меуегз, 1996, Веш 26), поэтому мы будем называть такой класс синглтоном Мейерса. Глава б. Реализация шаблона В!пд!е1оп Синглтон Мейерса использует некоторые скрытые свойства компилятора. Статические объекты, определенные в теле функции, инициализируются, когда поток управления впервые проходит через ее определение.

Не пугайте статические переменные, которые инициализируются во время выполнения программы, с элементарными статическими переменными, которые инициализируются статическими константами. Рассмотрим слелуюший пример. !пг РопО ( агат)с 5пт х = 100; гесцгп ++х; В данном случае переменная х инициализируется до выполнения первого оператора программы. При первом вызове функции Рип известно лишь, что переменная х давным-давно равна !ОО. В противном случае, когда переменная инициализируется не константой периола компиляции, или статическая переменная является объектом, имеюшим конструктор, локальная статическая переменная инициализируется во время выполнения программы при первом проходе потока управления через определение функции. Кроме того, компилятор так генерирует код, что после инициализации система подаержки выполнения программ регистрирует переменную как предназначенную к удалению, Этот алгоритм можно выразить с помошью следуюшего псевлокода.

(Переменные, имя которых содержит два подчеркивания, считаются скрытыми, т.е. они генерируются и управляются только компилятором.) 5!пц1етопф 5!пц1етоп::1пзтапсеО // вункции, генерируемые компилятором ехтегп чо!д сопзтгист5!пц1етоп(чо!о* мемогу); ехтегп чо!б оезтгоу5!пц1етопО; // Переменные, генерируемые компилятором зтат!с Ьоо1 злят!а1!лед = Еа1зе; // Буфер, в котором хранится синглтон // (предполагается, что буфер выровнен) зтат)с сйаг ЬцНег(з!геок(5!пц1етоп)3; !1 (! !и!тГа1!зео) ( // первый вызов, создается объект // Вызывается функция 5!пд1етоп::5!пц1етоп // в буферной памяти ЬиНег сопзтгцст5!пд1есоп( ЬоНег) // Регистрируется удаление атея!т( оезтгоу5)пц1етоп); зп!т!а1!аеб = тгое; гетмгп *ге!птегргес сазт<5!пц1етоп *>( ЬцНег); Сердцевиной этого кола является вызов стандартной функции атехйт, позволяюшей автоматически вызывать зарегистрированные ею функции при выходе из программы в порядке !.!ГО ()аа )и, йгм ош — последним пришел, первым ушел).

(По определению удаление объектов в языке С++ выполняется по принципу (,)ГО: объекты, созданные первыми, разрушаются последними. Разумеется, объекты, явно управляемые с помошью операторов пеи и де1ете, этому правилу не подчиняются.) Сигнатура функции атех! т имеет следуюший вид. Часть )!. Компоненты 156 // получает указатель на функцию.

// возвращает О, если работа выполнена успешно, // или ненулевое значение, если возникла ошибка )пт атех)т(чозд(ергцп) 0)*' Компилятор генерирует функцию оезтгоу5)пд1етоп, разрушающую объект класса 5( пд1етоп, хранящийся в буфере ЬиНег, и передает ее адрес функции атехз г. Как работает функция атехзтд При каждом вызове этой функции ее параметр заталкивается в закрытый стек, предусмотренный библиотекой поддержки выполнения программ на языке С (С щшцпе ВЬшгу). При выходе из приложения система поддержки вьн полнения программ вызывает функции, зарегистрированные функцией атех( т. Вскоре мы увидим, насколько важна функция атех(г, а также (иногда, к сожалению), насколько она тесно связана с реализацией шаблона проектирования 5зпд)етоп на языке С++.

Нравится вам это или нет, она останется в центре внимания до конца главы. Независимо от того, каким образом реализуется удаление объекта класса 51пд1етоп, для его выполнения необходима функция атех(с. Синглтоны Мейерса предоставляют простейшие средства для удаления объектов класса 5)пд1етоп при выходе из программы. В большинстве случаев они работают безупречно, Мы хорошо их изучим, внесем в них некоторые усовершенствования и создадим альтернативные реализации для специальных ситуаций. 6.6. Проблема висячей ссылки Чтобы конкретизировать наше обсуждение, рассмотрим пример, который мы будем в дальнейшем использовать для иллюстрации разных реализаций. Как и шаблон проектирования 5з пд1етоп, этот пример легко сформулировать и понять, но трудно реализовать.

Допустим, что в нашем приложении используются три синглтона: кеуЬоагд, п)зр1ау и ьод. У первых двух моделей есть физические прототипы. Синглтон ьод предназначен для генерации сообщений об ошибках. Он может воплощаться в виде текстового файла либо вспомогательной консоли. Будем предполагать, что конструкция синглтона ьод вынуждает затрачивать определенный объем дополнительных ресурсов, поэтому его лучше всего конкретизировать только в случае возникновения ошибки. Таким образом, если в программе нет ошибок, она вообще не создает объект класса ьод.

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

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

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