Операция new, при отказе возвращающая bad_alloc

Рис. 16.6 демонстрирует операцию new, которая при неудавшемся

выделении требуемого объема памяти выбрасывает исключение bad_alloc. Оператор

for (строки 20-24) внутри try-блока должен выполнить 50 проходов, выделяя

на каждом проходе массив из 50 000 000 значений типа double. Если new

терпит неудачу и выбрасывает bad_alloc, цикл завершается и программа

продолжается со строки 28, где catch-обработчик перехватывает и обрабатывает

исключение. Строки 30-31 печатают сообщение "Exception occurred:", за

которым следует сообщение об ошибке, возвращаемое функцией what базового

класса exception (т.е. определяемое реализацией и специфическое для

исключения сообщение, например, в Microsoft Visual Studio.NET 2003 это

"Allocation Failure"). Вывод показывает, что программа выполнила всего две итерации цикла, после чего new потерпела неудачу и выбросила исключение

bad_alloc. У вас вывод программы может отличаться от нашего в зависимости

от объема физической памяти, дискового пространства, доступного для

виртуальной памяти на вашей системе, и используемого компилятора.

// Рис. 16.6: TEST6.cpp

// Демонстрация стандартной new, выбрасывающей bad_alloc,

// если память не может быть выделена.

#include <iostream>

using std::cerr;

using std::cout;

using std::endl;

#include <new> // стандартная операция new

using std::bad_alloc;

int main()

{

double *ptr[ 50 ];

// выделить память для ptr

try

{

// выделить память для ptr[ i ]; new выбрасывает bad_alloc

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

{

ptr[ i ] = new double[ 50000000 ]; // возможно исключение

cout << "Allocated 50000000 doubles in ptr[ " << i << " ] \n";

} // конец for

} // конец try

// обработать исключение bad_alloc

catch (bad_alloc &memoryAllocationException)

{

cerr << "Exception occurred: "

<< memoryAllocationException.what() << endl;

} // конец catch

return 0;

} // конец main

/*

Allocated 50000000 doubles in ptr[ 0 ]

Allocated 50000000 doubles in ptr[ 1 ]

Exception occurred: bad alloc exception thrown

*/

Стандарт C++ специфицирует, что совместимые с ним компиляторы могут

допускать использование версии new, при отказе возвращающей О. Для этой

цели заголовочный файл <new> определяет объект nothrow (типа nothrow_t),

используемый следующим образом:

double *ptr = new(std::nothrow) double[ 50000000 ];

Этот оператор для выделения массива из 50 000 000 значений типа double

использует версию new, не выбрасывающую исключений bad_alloc.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: