    Листинг 12.10 поясняет, как использовать new для выделения памяти для 
структур, а также демонстрирует, что происходит, когда программе не хватает 
свободной памяти. Вы можете скомпилировать и запустить программу как 
EasyWin-приложение из интегрированной оболочки или же из командной строки DOS. 
В обоих случаях компилятор выдаст предупреждение "Unreachable code" 
(Недостижимый код). (В следующем разделе разъяснено, в каких случаях выдается 
это предупреждение.) 

    Листинг 12.10.  MEHERR.CPP (демонстрация new и ошибок,  связанных с 
нехваткой памяти) 

    1:	#include	<iostream.h> 
    2:	#include	<new.h> 
    3:	#include	<stdlib.h> 
    4: 
    5:	struct q	{ 
    6:	  int ia[1024]; // 2048-байтовая структура 
    7: 	};
    8.	 
    9:	main() 
    10:	{ 
    11:	struct q	*qp; // Указатель на структуру q 
    12: 
    13:	set new handler(O); // Указание new вернуть О в случае неудачи 
    14:	for (;;)  { // Повторять следующий оператор "без конца" 
    15:	   qp = new q; // Выделить новую структуру типа q 
    16:	   cout «	qp, « ' \n ' ; //, Вывести адрес структуры 
    17:	   if (qp == 0) { // В случае возврата new 0 следует: 
    18:	      cout « "Out of memory\n"; // Вывести сообщение об ошибке 
    19:	     exit(1);	// Прервать программу с кодом завершения 1 
    20:	  } 
    21:	} 
    22:	return 0	;// В этой строке выдается предупреждение "unreachable code" 
    23:	}
 
    В качестве программных данных в строках 5-7 объявляется структура с 
массивом 1,024 целых значений. При обработке этой структуры new выделяет 
2,048-байтовый блок (учитывая тот факт, что целое значение занимает два 
байта). Повторяя эту операцию до бесконечности, программа исчерпывает запасы 
свободной памяти, демонстрируя, что случается, когда new не может выделить ее достаточно. 
    Чтобы new возвращал нуль в случае ошибки, программа передает 0 функции 
set_new_handler(). После этого "бесконечный" цикл for выполняет несколько 
операторов. Первый из них вызывает new для выделения 2048-байтовой структуры и 
присваивает ее адрес указателю qp. Далее оператор вывода отображает адрес, 
хранящийся в qp. Если qp — нуль, то это означает, что new не сумел выделить 
достаточно памяти, программа выводит сообщение об ошибке и затем аварийно 
завершает выполнение с помощью вызова функции exit(). Вот что отобразилось на 
дисплее при запуске этой программы (адреса могут отличаться от тех, что будут 
выведены на вашем экране): 

    0x1366 
    0x1Ь8а 
    ...........
    0x0000 
    Out of memory 

    Если программа не вызывает set_new_handler(), new возбуждает 
исключительную ситуацию вместо того, чтобы вернуть нуль. Для демонстрации 
этого отличия, закомментируйте или удалите оператор set_new_handler(), 
скомпилируйте программу заново и запустите ее. Теперь программа выведет: 

    0x1366 
    0x1Ь8а 
    .......
    0x0000 
    Abnormal program termination 

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

    ЗАМЕЧАНИЕ 

    Поскольку по умолчанию new вызывает исключительную ситуацию, программы в 
этом и последующих разделах не будут осуществлять проверку на правильность 
возвращаемого new значения, как это было в большинстве программ, приведенных в 
первом дадании этой книги. Все ошибки, связанные с нехваткой амяти, вызывают 
аварийное завершение с выводом сообщения "Abnormal program tenainatjon" (Аварийное 


    Глава 12. Введение в C++     291 
