Рис. 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.