Скачиваний:
62
Добавлен:
05.07.2021
Размер:
94.13 Кб
Скачать

Класс allocator

Оператор new всегда объединяет резервирование памяти с созданием объекта в этой области памяти, что обычно подходит при создании одиночного объекта. Когда резервируется блок памяти, то обычно объекты в нем создаются по мере необходимости.

При использовании оператора new высока вероятность, что проинициализированные им объекты никогда не будут использованы. Кроме того, некоторым элементам, проинициализированным оператором new, будут присваиваться новые значения поверх только что записанных. Это приводит к избыточности первичной инициализации оператора new. Библиотечный класс allocator позволяет отделить резервирование от создания объекта.

Class allocator обеспечивает нетипизированное резервирование свободной области памяти, так как класс является шаблонным , необходимо указать тип объекта , память под который он будет резервировать .

Метод allocate позваляет резервировать пустую область памяти ,для хранения заданного количества объекта, метод. Dellocate освобождает область памяти , начиная с адреса указанного в первом параметре , колтчество которой определяется параметром count

Метод construct создает объект определенного типа по указанному адресу .

Метод destroy разрушает память

Память, которую резервирует объект класса allocator, не заполнена. Использование незаполненной области памяти, в которой еще не был создан объект, явялется ошибкой.

По завершении использования объекта следует удалить ранее созданные элементы, вызвав метод destroy(), а затем освободить зарезервированную память, вызвав метод deallocate().

Удалять можно только те элементы, которые были фактически созданы.

Указатель передаваемой функции deallocate() не может быть нулевым, он должен указывать на область памяти, зарезервированную функцией allocate(). Переданный аргумент функции deallocate() должен совпадать с размером памяти, переданной функции allocate().

В дополнении к классу allocator  библиотека с++ дает алгоритмы создания объектов в неинициализированной области памяти: 

1)uninitialiazed copy, позволяет копировать объекты из указанного диапазона , в целевую не инициализированную память

2)uninitialiazed copy_nt делает тоже самое

3) uninitialiazed fill Позволяет создать объекты , как копию последнего аргумента

4) uninitialiazed fill_nt делает тоже самое с определенным количеством элементов

Тема 2. Обработка исключительных ситуаций

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

Разные компиляторы выдают разные аварийные сообщения.

Для определения возникшей проблемы удобнее не просто прекращать выполнение программы, а использовать значение возвращенной функции. Например, метод get() класса istream обычно возвращает ASCII-код введённого символа, но в случае конца файла возвращает специальное значение EOF.

Ещё один вариант сохранения возвращаемых функций значений – это применение глобальных переменных. При возникновении исключительных ситуаций функция может заносить в глобальную переменную определенное значение, а вызываемая программа может это значение проверять. Такой подход реализован в стандартной библиотеке С++, в которой исп. переменная errno.

В С ++ исключение – это нестандартная ситуация. возникающая во время выполнения программы. Например, при делении на 0, при вводе неверного типа данных, при невозможности открыть ресурс, либо создать ресурс на неуказанном носители.

Исключение позволяет передать управление из одной части программы в другую. Для управления исключениями доступны 3 компоненты:

  1. Использование блока try{}, который потенциально может создать исключительную ситуацию;

  2. Генерация исключений в блоке try{};

  3. Оператор throw{} является оператором перехода, поскольку при этом управлении передается оператором в другом месте программы. Ключевое слово throw предназначено для создания объекта исключения. После оператора throw указывается значение, обозначающее тип исключения.

Программа перехватывает исключения с помощью обработчика исключения в том месте программы, где исключение необходимо словить и обработать. Обработчик исключения всегда содержит объявление типа исключения. Блок catch и блок try всегда собой представляют отдельную область видимости. Ключевое слово catch вместе с типом исключения представляет собой метку. Блок catch также называют блоком перехвата.

Выполнения оператора throw похоже на выполнение оператора return в том смысле, что он завершает выполнение функции. Однако, вместо возврата управления в вызывающей программе, оператор throw заставляет программу возвращаться по текущей цепочке вызова функции до тех пор, пока не буден найден соответствующий блок catch.

Программа ищет обработчик исключения, который соответствует типу сгенерированному объекту исключения. Если исключения в блоке try не произошло, то оно пропускает все блоки catch и переходит к выполнению оператора, следующим за всеми обработчиками.

Обычно исключение представляет собой объект, что позволяет создавать объекты различных типов в зависимости от различного рода исключительных ситуаций. Объект исключительной ситуации может содержать дополнительную информацию, характеризующее причину исключения, но основании которой может быть предпринято решение, как обработать исключительную ситуацию.

Спецификации исключений в С++

Спецификация исключений были добавлены в С++ 98 , но в С++11 объявлены устаревшими, что говорит о том , что в будущем они будут изъяты и в новом коде их лучше не использовать.

Часть throw после сигнатуры функции со списком исключений или без него описывает спецификацию исключений функции, которая должна присутствовать как в прототипе , так и в реализации функции.

Спецификация исключений уведомляет о том , что может потребоваться блок try{}. Ещё одной причиной использования спецификации исключения является разрешение компилятору добавлять код, который во время выполнения будет проверять нарушено ли спецификация исключений. В С++ 11 разрешена спецификация с ключевым словом noexcept , которая говорит, что функция не генерирует исключений.

Предположим, что блок try не содержит вызова функции, создающей исключение, однако, он вызывает функцию, которая генерирует исключение. При этом управление передается из функции, в которой возникло исключение, в функцию, содержащую блок try и необходимые обработчики. Это называется раскручиванием стека. При вызове функции информация о ней заносится в стек. Также в стеке сохраняется адрес инструкции вызывающей функции(адрес возврата), который используется для определения точки продолжения выполнения программы. Аргументы функции также сохраняются в стеке и являются автоматическими переменными. Функция возвращает управление в точку своего вызова после завершения своего тела и освобождает свои автоматические переменные, если это объект класса, то вызывается его деструктор.

Предположим, что возник exception, при этом программа начнет очищать стек вызова функции, но вместо перехода на ближайший адрес возврата, очистка стека будет продолжена до тех пор, пока не достигнет адреса возврата, находящегося в блоке try. Затем управление передается блоку catch, следующим за этим блоком, если тип исключения соответствует типу, указанному в блоке catch.

Важной особенностью механизма операции throw является то, что при возврате из функции для всех автоматическим объектов, находящихся в стеке, вызывается деструктор.

24 мар 2021