Рис. 16.5 демонстрирует версию new, которая при неудавшемся выделении
требуемого объема памяти возвращает 0. Оператор for в строках 13-24 должен
выполнить 50 проходов, выделяя на каждом проходе массив из 50 000 000
значений типа double (т.е. 400 000 000 байт, поскольку double обычно занимает 8
байт). Оператор if в строке 17 проверяет результат каждой из операций new,
определяя, была ли память успешно выделена. Если new терпит неудачу и
возвращает 0, строка 19 печатает сообщение об ошибке и цикл завершается. [За
мечание. Для запуска этого примера мы воспользовались компилятором
Microsoft Visual C++ 6.0, поскольку Microsoft Visual Studio.NET при отказе
new не возвращает 0, а выбрасывает исключение bad_alloc]
// Рис. 16.5: TEST5.cpp
// Демонстрация до-стандартной new, возвращающей 0, если память
//не выделена.
#include <iostream>
using std::cerr;
using std::cout;
int main()
{
double *ptr[ 50 ];
// выделить память для ptr
for (int i = 0; i < 50; i++)
{
ptr[ i ] = new double[ 50000000 ];
if (ptr[ i ] == 0) // если new не удается выделить память
{
cerr << "Memory allocation failed for ptr[ " << i << " ]\n";
break;
} // конец if
else// успешное выделение памяти
cout << "Allocated 50000000 doubles in ptr[ " << i << " ]\n";
} // конец for
return 0;
} // конец main
/*
Allocated 50000000 doubles in ptr[ 0 ]
Allocated 50000000 doubles in ptr[ 1 ]
Memory allocation failed for ptr[ 2 ] // в VS2008 так не будет
*/