СОЗДАНИЕ ОБРАБОТЧИКА ДЛЯ ОПЕРАЦИЙ СО СВОБОДНОЙ ПАМЯТЬЮ
Как вы уже знаете из урока 31, если оператор new не может выделить требуемую память из свободной памяти, он присваивает значение NULL вашей переменной-указателю. Следующая программа USE_FREE.CPP неоднократно вызывает оператор new, выделяя каждый раз 1000 байт, пока свободная память не исчерпается:
#include iostream.h
void main (void)
{
char *pointer;
do
{
pointer = new char[1000];
if (pointer 1= NULL) cout "Выделено 1000 байт" endl;
else cout "Свободной памяти нет " endl;
} while (pointer);
}
Как видите, программа просто выполняет цикл, пока new не присвоит указателю значение NULL. Если вы хотите, чтобы new выполнил другие действия (что-нибудь отличное от тупого возвращения значения NULL), когда он не может удовлетворить запрос на память, то сначала вам следует определить функцию, которую должна вызывать ваша программа, если памяти недостаточно для удовлетворения запроса. Например, следующая функция end_pro-gram выводит на экран сообщение, а затем использует функцию библиотеки этапа выполнения exit для завершения программы:
void end_program(void)
{
cout "Запрос на память не может быть удовлетворен" endl;
exit(l);
}
Чтобы заставить C++ вызывать функцию end_program, если new не может удовлетворить запрос на память, вам необходимо вызвать функцию set_new_handler, указав ей функцию end_program в качестве параметра, как показано ниже:
set_new_handler(end_program);
Следующая программа END_FREE.CPP вызывает функцию end_program, если new не может удовлетворить запрос на память:
#include iostream.h
#include stdlib.h // Прототип exit
#include new.h // Прототип set_new_handler
void end_program(void)
{
cout "Запрос на память не может быть удовлетворен" endl;
exit(l);
}
void main(void)
{
char* pointer;
set_new_handler(end_program);
do
{
pointer = new char[10000];
cout "Выделено 10000 байт" endl;
} while (1);
}
В данном случае программа просто завершается, если new не может выделить память из свободной памяти. В зависимости от потребностей вашей программы вы могли бы использовать функцию для выделения памяти из другого источника, например из расширенной памяти компьютера, которая существует в среде MS-DOS. Кроме того, ваша программа могла бы освободить память распределенную ею для других целей, чтобы сделать доступной свободную память. Обеспечивая вашим программам возможность создавать обработчик ситуации отсутствия памяти, C++ предоставляет вам полный контроль над процессом распределения памяти.