Программирование >>  Расширенная версия языка c++ 

1 ... 112 113 114 [ 115 ] 116 117 118 ... 227


/лава 11 лоны ботка исключительных ситуаций 351

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

11.5. Обработка У :

исключительных ситуаций, ,1 5

возбуждаемых оператором new

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

В материале этого раздела атрибуты оператора new описаны так, как это определено в современном едином международном стандарте Standard C++. Как уже упоминалось в главе 4, с момента появления языка C++ точное определение действий, которые должны выполняться при неудачной попытке выделения памяти с помощью оператора new, менялось несколько раз. Сразу после разработки языка при неудачной попытке выделения памяти оператор new возвращав .иь, несколькими годами позднее - возбуждал исключительную ситуацию. Кроме того, неоднократно менялось имя этой исключительной ситуации. В конце концов было решено, что неудачная попытка выделения памяти с помощью оператора new по умолчанию будет возбуждать исключительную ситуацию, но по желанию в качестве опции можно возвращать нулевой указатель. Таким образом, оператор new реали-зовывался по-разному в разное время разными производителями компиляторов. Хотя в будущем все компиляторы должны быть выполнены в точном

соответствии с требованиями стандарта Standard C++, сегодня это не так.

Если представленные здесь примеры программ у вас не работают, проверьте по документации вашего компилятора то, как именно в нем реализован оператор new.

В соответствии со стандартом Standard C++, когда требование на выделение памяти не может быть выполнено, оператор new возбуждает исключительную ситуацию При невозможности перехватить эту исключительную ситуацию программа завершается. Хотя для коротких программ такой алгоритм кажется вполне очевидным и понятным, в реальных приложениях вы должны не только перехватить, но и каким-то разумным образом обработать эту исключительную ситуацию. Для доступа к указанной исключительной ситуации в программу необходимо включить заголовок <new>.



Изначально описанная выше исключительная аций называлась мПос и во время написания данной книги это имя продолжало использоваться на многих компиляторах. Тем не менее в дальнейшем оно, несомненно, будет вытеснено определенным в стандарте Standard С++ именем bad atioc

Как уже упоминалось, в соответствии с требованиями стандарта Standard C++ при неудачной попытке выделения памяти допускается, чтобы оператор new возвращал нуль, а не возбуждал исключительную ситуацию. Такая форма оператора new может оказаться полезной при компиляции устаревших программ на современном компиляторе, а также при замене функций malloc() операторами new. Ниже представлена именно эта форма оператора new:

указатель = neH(nothrow} sram;

Здесь указатель - это указатель на переменную типа тип. Форма оператора new с ключевым словом nothrow (без вызова исключительной ситуации) функционирует аналогично его прежней, изначальной версии. Поскольку в этом случае при неудачной попытке выделения памяти возвращается нуль, оператор new может быть легко встроен в старые программы и вам не

нужно заботиться о формировании процедуры обработки какой бы то ни

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

примеры--к

имеры

I. В представленном ниже примере с оператором new использование блока try/catch дает возможность проконтролировать неудачную попытку выделения памяти.

ttinclude <iostream> . ,

tfinclude <new> .

using namespace std;

. .. - ; - -1 - ,.

int main ()

{ . .

try {

p = new int; выделение памяти для целого } catc alloc xa) {

cout << Ошибка выделения памяти\п ;



/лав 1 1. Шаблоны и обработка исключительные уаций 353

return 1; . i,-.

for(*p = 0; *р < 10; (*р)++)

cout *р ; .

delete; освобождение памяти : * л.

return 0; -

)

В данное mfeje. если при выделении памяти случается ошибка, она перехватывается инструкцией catch.

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

ниже примере для демонстрации возможности возбуждения исключительной

оператором new ошибка выделения памяти достигается принудительно. Процесс выделения памяти длится до тех пор, пока не произойдет

ошибка.

#include <iostreein> finclude <new> using namespace std;

int raainO

double *p; tJV -i ..1

цикл будет продолжаться МОТЬ до исчерпания ресурса памяти do {

try { ,

p = new double[100000] ; } catch (bad alloc xa) ( ; .

cout Ошибка выделения памятиХп ;

return 1;

cout Выделение памяти идет норыально\п ; } while (р); - .

return

3, в следующей программе показано, как использовать альтернативную форму оператора new - оператор new(nothrow). Это переработанная версия предыдущей программы с принудительным возбуждением исключительной ситуации.

Демонстрация работы оператора new(nothrow) . . .р., .,

#include <iostream> # include <:new>



1 ... 112 113 114 [ 115 ] 116 117 118 ... 227

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