Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 57стр.doc
Скачиваний:
54
Добавлен:
15.06.2014
Размер:
478.21 Кб
Скачать

Вопрос 44. Конструкторы, деструкторы и исключения. Исключения и наследование.

Предположим, что произошла ошибка при выполнении конструктора какого-то объекта. При возникновении ошибки в конструкторе, в нем генерируются исключение. Обработчик должен иметь доступ к объекту. Если в конструкторе генерируются исключение, то перед тем, как управление передаётся на обработчик вызываются деструкторы всех полностью созданных объектов базовых классов

Вызов деструктора помещается в блоке try и исключение отлаживается в блоке catch. Если в блоке catch указывается указатель или ссылка на базовый класс, то этот блок catch будет отлаживать и исключения всех производных классов.

Деструкторы вызываются для каждого автоматического объекта, созданного в блоке try. Исключение обрабатывается в момент, когда начинает выполняться обработчик; разматывание стека завершается к этому времени. Если деструктор, вызываемый в результате разматывания стека, генерирует исключение, то вызывается ф-ция завершения terminate и программа завершается.

Uncaught_exception() – проверка, как уничтожен объект; возвращает true, если всё нормально

Исключения и наследование

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

Достоинство наследования для исключений:

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

Вопрос 45. Обработка неуспешного выполнения new.

Существует несколько методов обработки неуспешного выполнения new. Чаще используется макрос assert для проверки значения, возвращаемого new. Если это значение = 0, макрос assert завершает программу. Недостаток: не обеспечивается восстановление после ошибок.

Если оператор new не может выделить память, то генерируется исключения bad_alloc(чаще возвращает - 0), set_new_handler (принимает в кач-ве аргумента ук-ль на ф-цию, к-ая не принимает аргументов и возвращает void. Этот ук-ль регистрируется как ф-ция, к-ая должна вызываться при отказе new).

Операция new в действительности явл-ся циклом, к-ый пытается получить память.

Если память выделяется, new возвращает указатель на нее. Если память не выделена и никакой ф-ции обработчика new с помощью set_new_handler зарегистрировано не было, операция new выбрасывает исключение bad_alloc. Если память не выделена и была зарегистрирована функция обработчика new, то вызывается эта ф-ция. Ф-ция обработчика new должна выполнить одно из следующих действий:

1. увеличить объём доступной памяти путем освобождения других областей динамической памяти и возвратиться в цикл new, возобновив попытки выделения памяти.

2. выбросить исключение типа bad_alloc.

3. вызвать ф-цию abort или exit для завершения программы.

int main()

{double *ptr[50];

try {

for(int i=0;i<50;i++)

{ ptr[i]=new double[5000000];

cout<<”Память выделена”;

}

}

catch(bad_alloc exception){

cout<<exception.what();

}