Программирование >>  Операторы преобразования типа 

1 ... 7 8 9 [ 10 ] 11 12 13 ... 239


Единственным источником информации об исключении, помимо функции what(), является конкретный тип исключения. Например, при обработке исключения bad al!oc программа может попытаться выделить дополнительную память.

Генерирование стандартных исключений

Стандартные исключения также могут генерироваться в пользовательских библиотеках или программах. Объекты всех классов стандартных исключений, предоставляющих такую возможность, создаются с одним параметром: объектом string (см. главу И) с описанием, которое должно возвращаться функцией what(). Например, определение класса logic error выглядит так:

namespace std {

class logic error ; public exception [ public:

explicit logic error (const strings whatString);

Набор стандартных исключений, которые могут генерироваться в пользовательских библиотеках или программах, включает класс 1од1с еггог с производными классами, класс runtime error с производными классами, а также класс ios base:;failure. Следовательно, вы не сможете генерировать исключения базового класса exception, а также любых классов исключений, предоставляющих языковую поддержку.

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

std:;string s:

throw std::out of range(s):

Автоматическое преобразование char* в string позволяет использовать строковый литерал:

throw std::out of range( out of range (somewhere, somehow) );

Классы исключений, производные от exception

Существует и другой вариант использования стандартных классов исключений в программах. Он основан на определении специализированных классов, прямо или опосредованно производных от exception. При этом необходимо обеспечить работу механизма what() в производном классе.

Функция what() объявлена виртуальной, поэтому один из вариантов предоставления функции whatO основан на ее самостоятельной реализации:

namespace MyLib {

/* Пользовательский класс исключений * объявлен производным от стандартного класса исключений */



Создание объекта и генерирование исключения throw MyProblemC-..):

В другом варианте предоставления функции what() класс исключения объявляется производным от класса, имеющего конструктор со строковым аргументом для функции w/hat():

namespace MyLib {

/* Пользовательский класс исключения

* объявлен производным от стандартного класса

* с конструктором для аргумента whatO */

class MyRangeProblem : public std:;out of range { public:

MyRangeProblem (const strings whatString) : out of rangG(whatStrlng) {

void fC) {

Создание объекта конструктором со строковым аргументом и генерирование исключения

throw MyRangeProblemChere 1S my special range problem ):

Примеры использования этого подхода в программе встречаются в классах stack (см. с. 422) и queue (см. с. 430).

class МуРгоЫет : public std::exception { public:

MyProblem(...) { Специальный конструктор

virtual const char* whatO const throwC) { Функция whatO }

void f() (



Распределители памяти 49

Распределители памяти

В стандартной библиотеке С++ достаточно часто используются специальные объекты, занимающиеся выделением и освобождением памяти. Такие объекты называются распределителями (allocators). Распределитель представляет собой абстракцию, которая преобразует потребность в памяти в физическую операцию ее выделения. Параллельное использование разных объектов-распределителей позволяет задействовать в программе несколько разных моделей памяти.

Сначала распределители появились в STL для решения раздражающей проблемы с различиями в типах указателей для разных моделей памяти (near, far, huge). В наше время на их основе создаются решения, способные поддерживать разные модели памяти (общая память, уборка мусора , объектно-ориентированные базы данных) без изменения интерфейса. Впрочем, такое применение распределителей - явление относительно недавнее, и оно еще не получило широкого распространения (вероятно, в будущем ситуация изменится).

В стандартной библиотеке С++ определяется следующий распределитель по умолчанию:

namespace std {

template <class Т> class allocator:

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

В большинстве программ используется распределитель по умолчанию. Иногда библиотеки предоставляют специализированные распределители, которые просто передаются в виде аргументов. Необходимость в самостоятельном программировании распределителей возникает очень редко, на практике обычно достаточно распределителя по умолчанию. По этой причине мы отложим подробное описание распределителей до главы 15, где рассматриваются не только распределители, но и их интерфейсы.



1 ... 7 8 9 [ 10 ] 11 12 13 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.002
При копировании материалов приветствуются ссылки.
Яндекс.Метрика