664___________________________________________Глава11

void Fl(void)
{

ShowMessage("He хватает памяти");

exit (1);

)

которая обрабатывает ситуацию, связанную с нехваткой памяти, и ввести в прс
грамму (например, в обработчик события OnCreate формы) оператор

set_new_handler(Fl);

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

Можно отменить генерацию исключения bad_alloc, не вводя специального о(
работчика, а просто записав оператор

set new handler(0);

В этом случае при недостатке памяти операция new будет возвращать NULI
Тогда проверку можно строить, проверяя, не равен ли значению NULL указател!
возвращенный new.

Приведенные ранее примеры относились к динамическому размещению в пг
мяти одиночных объектов. Аналогичным образом можно размещать и массивы
Например, оператор

double *A = new double[100];

динамически размещает массив из 100 действительных чисел. К его элементам
дальнейшем можно обращаться как обычно по индексу: A[ind]. При использов{
нии для создания массива операции new надо иметь в виду, что в момент создани
его нельзя инициализировать, как это делается с одиночными объектами.

Можно создавать и многомерные массивы. Например, оператор

double *М = new double [100] [•100] ;

создает и динамически размещает в памяти двумерный массив. При размещени
многомерных массивов надо иметь в виду, что первый размер можно задавать ш
ременной, но остальные размеры задаются только константами. Например:

double *М = new double[n][100];

Динамически распределенную память надо освобождать, когда отпадает нео(
ходимость в размещенных в ней объектах. В противном случае получится неопра!
данная утечка памяти. Освобождение памяти осуществляется операцией delete
Она выполняет то же, что описанная ранее стандартная библиотечная функци,
free. Но использование delete предпочтительнее. Во всяком случае все, что размс
щается в памяти операцией new, должно удаляться операцией delete.

Операция может иметь следующие формы записи:

<::> delete <выражение>

<::> delete [ ] <выражение>

delete <имя_массива> [ ] ;

Например:

double *A = new double(5.1);

delete A;

или

double *A = new double[100];

delete [] A;