Программирование на C и C++

Онлайн справочник программиста на C и C++

Еще один способ контроля за выделением памяти

В самом начале, когда был изобретен язык С++, оператор new не генерировал исключения при возникновении ошибки выделения памяти. Вместо этого он возвращал NULL, в точности как фун­кция malloc() языка С. Если необходимо, чтобы оператор new работал таким образом вместо генерации исключения, просто надо вызвать функцию set_new_handler() с нулевым значением в качестве аргумента. После этого оператор new будет возвращать NULL, если он не сможет выде­лить запрашиваемую память. Кроме того, необходимо включить в заголовочный файл new.h.

Следующая программа показывает этот альтернативный подход к использованию new. В ней вначале вызывается функция set_new_handler() с аргументом, равным нулю, а затем в цикле выде­ляется память до тех пор, пока не исчерпывается вся доступная для выделения память.

// демонстрация альтернативы new
#include <new.h>
#include <iostream.h>
int main()
{
double *p;
// new возвращает нуль в случае ошибки
set_new_handler(0);
// со временем память исчерпается
do {
р = new(std::nothrow) double[100000];
if (р) cout << "Allocation OK\n";
else cout << "Allocation Error\n";
} while(p);
return 0;
}

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