Итак, функции, такие как make_vec(), подчиняются основным правилам корректного управления ресурсами с использованием исключений. Это обеспечивает выполнение базовой гарантии, которую должны давать все правильные функции при восстановлении работы программы после генерирования исключений.
Также вам может показаться, что такая тема как телесно ориентированная психотерапия и http://www.perception.ru/articles/top никак не связана и даже не тематичны с программированием.
Возможно, это и так, но все-таки зайдите на сайт perception.ru, чтобы узнать там много интересного про такую тему, как телесно ориентированная психотерапия. Что такое телесно ориентированная психотерапия, сколько стоит телесно ориентированная психотерапия - про это написано на сайте про телесно ориентированную психотерапию. Это важная для многих тема - телесно ориентированная психотерапия. Спасибо за информацию сайту perception.ru
Если не произойдет чего-либо катастрофического с нелокальными данными в той части программы, которая ответственна за заполнение вектора данными, то можно даже утверждать, что такие функции дают жесткую гарантию. Однако этот блок try . . . catch по-прежнему выглядит ужасно. Решение очевидно: нужно как-то применить принцип RAII; иначе говоря, необходимо предусмотреть объект, который будет владеть объектом класса vector и сможет его удалить, если возникнет исключение. В заголовке стандартной библиотеки содержится класс auto_ptr, предназначенный именно для этого.
vector* make_vec() // создает заполненный вектор {
auto_ptr< vector > p(new vector); // выделяет свободную
// память
// . . . заполняем вектор данными;
// возможна генерация исключения . . .
return p.release(); // возвращаем указатель,
// которым владеет объект p
}
Объект класса auto_ptr просто владеет указателем в функции. Он немедленно инициализируется указателем, созданным с помощью оператора new. Теперь мы можем применять к объектам класса auto_ptr операторы -> и * как к обычному указателю (например, p-> at(2) или (*p).at(2)), так что объект класса auto_ptr можно считать разновидностью указателя. Однако не спешите копировать класс auto_ptr, не прочитав соответствующей документации; семантика этого класса отличается от семантики любого типа, который мы до сих пор встречали. Функция release() вынуждает объект класса auto_ptr вернуть обычный указатель обратно, так что мы можем вернуть этот указатель, а объект класса auto_ptr не сможет уничтожить объект, на который установлен возвращаемый указатель. Если вам не терпится использовать класс auto_ptr в более интересных ситуациях (например, скопировать его объект), постарайтесь преодолеть соблазн. Класс auto_ptr предназначен для того, чтобы владеть указателем и гарантировать уничтожение объекта при выходе из области видимости. Иное использование этого класса требует незаурядного мастерства.
Класс auto_ptr представляет собой очень специализированное средство, обеспечивающее простую и эффективную реализацию таких функций, как make_vec(). В частности, класс auto_ptr позволяет нам повторить наш совет: с подозрением относитесь к явному использованию блоков try; большинство из них вполне можно заменить, используя одно из применений принципа RAII.
Опубликовал katy
April 21 2015 13:30:43 ·
1 Комментариев ·
2378 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Oleg27 October 24 2023 05:27:31
Из онлайн игр мне нравятся киберспортивные дисциплины, я даже ставить на них начал, хотя до карантинов и прочего только футбол смотрел https://1xBetvip.site/ . Но из-за длительного перерыва большого спорта перешел на киберспорт, ведь тут игроки могут играть прямо из своих домов и перерывов не было.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.