Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание программ на С++.doc
Скачиваний:
15
Добавлен:
29.09.2019
Размер:
1.59 Mб
Скачать

Освобождение памяти, если она больше не нужна

Как вы знаете, оператор C++ new позволяет вашим программам выделять память динамически во время выполнения. Если вашей программе больше не нужна выделенная память, она должна ее освободить, используя оператор delete. Для освобождения памяти с использованием оператораdelete вы просто указываете этому оператору указатель на данную область памяти, как показано ниже:

delete pointer;

Следующая программа DEL_MEM.CPP использует оператор delete для освобождения выделенной с помощью оператора new памяти:

#include <iostream.h>

#include <string.h>

void main(void)

{     char *pointer = new char[100];     strcpy(pointer, "Учимся программировать на языке C++");     cout << pointer << endl;     delete pointer;  }

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

Второй пример

Следующая программа ALLOCARR.CPP выделяет память для хранения массива из 1000 целочисленных значений. Затем она заносит в массив значения от 1 до 1000, выводя их на экран. Потом программа освобождает эту память и распределяет память для массива из 2000 значений с плавающей точкой, занося в массив значения от 1.0 до 2000.0:

#include <iostreain.h>

void main(void)

{     int *int_array = new int[1000];     float *float_array;     int i;     if (int_array 1= NULL)

   {        for (i = 0; i < 1000; i++) int_array[i] = i + 1;        for (i = 0; i < 1000; i++) cout << int_array[i] << ' ';        delete int_array;     }     float_array = new float[2000];     if (float_array != NULL)

   {        for (i = 0; i < 2000; i++) float_array[i] = (i + 1) • 1.0;        for (i = 0; i < 2000; i++) cout << float_array[i] << ' ' ;        delete float_array;     }  }

Как правило, ваши программы должны освобождать память с помощью оператора delete по мере того, как память становится программам не нужна.

Что вам необходимо знать

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

    1. Способность выделять память динамически во время выполнения снимает с ваших программ зависимость от фиксированных размеров массивов.

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

    3. Если оператор new не может выделить требуемую вашей программой память, он возвращает NULL-указатель, который содержит значение 0.

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

    5. Используя указатель на массив, ваши программы могут обращаться к памяти, выделенной с помощью оператора new.

    6. Оператор new выделяет память из блока неиспользуемой памяти, называемой свободной памятью.

    7. В зависимости от вашей операционной системы и модели памяти компилятора размер свободной памяти может быть различным. В среде MS-DOS свободная память может быть ограничена 64 Кбайт.

    8. Если вашей программе больше не нужна выделенная память, она должна освободить ее (вернуть в свободную память), используя для этого оператор delete.

УРОК 32. УПРАВЛЕНИЕ СВОБОДНОЙ ПАМЯТЬЮ

Из урока 31 вы узнали, что при выполнении ваши программы могут использовать оператор new для динамического распределения памяти из свободной памяти. Если оператор new успешно выделяет память, ваша программа получает на нее указатель. Если оператор new не может выделить требуемую память, он присваивает вашей переменной-указателю значение NULL. В зависимости от назначения вашей программы, вы, возможно, захотите, чтобы программа выполнила определенные операции, если new не может удовлетворить запрос на память. Из этого урока вы узнаете, как заставить C++ вызвать специальную функцию, еслиnew не может удовлетворить запрос на память. К концу данного урока вы освоите следующие основные концепции:

  • Вы можете создать свой собственный обработчик ситуации, когда памяти недостаточно — функции, которую C++ вызывает, если new не может удовлетворить запрос на память.

  • C++ позволяет вам определить собственный оператор new длявыделения и, возможно, инициализации памяти.

  • C++ позволяет вам определить собственный оператор delete для освобождения памяти.

Как вы узнаете, с помощью собственных операторов new и delete вы можете лучше управлять ошибками при недостаточности памяти.