Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gos_YPMT_1.DOC
Скачиваний:
15
Добавлен:
01.07.2025
Размер:
102 Кб
Скачать
☆

4 Управление динамической памятью

Автоматическая и управляемая память

Выделение памяти new

Таблица распределения памяти

Освобождение памяти delete

Область видимости объектов?????

Использование операций и функций alloc (), free (), coreleft ()

Особенности использования памяти в DOS и Windows

Объекты, используемые в программах, хранятся в оперативной памяти по определенным адресам и могут занимать разное количество байтов. Есть несколько вариантов выделения памяти для объектов:

по времени выделения – статический и динамический. Статические объекты получают память в самом начале работы программы и освобождают по окончании работы. Динамические получают и освобождают память во время работы по мере необходимости (иногда по несколько раз).

по способу выделения – автоматический и управляемый программистом. Автоматические объекты получают память при входе в соответствующий блок программы и освобождают при выходе из него. Управляемое программистом выделение и освобождение памяти выполняется с помощью специальных операций или функций.

Автоматические объекты описываются внутри блоков (тел функций) с описателем auto и область их видимости в программе - это фрагмент от описания до конца блока. Кроме того, к автоматическим объектам относятся все формальные параметры функций. Вся память для автоматических объектов выделяется в адресном пространстве данного приложения (программы).

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

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

char s;

s = new [100] char;

if ( s == NULL )

error (‘not enough memory’);

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

Освобождение памяти выполняется операцией delete, в которой указывается адрес ранее полученной памяти. Например, оператор delete s []; освобождает ранее полученную память по адресу в указателе s. При этом сам указатель не очищается, т.е. он помнит последний адрес, но пользоваться им уже нельзя. К ошибкам будут приводить попытки освобождения памяти, полученной другим механизмом, например статической или автоматической. Также запрещается память, полученную одним куском, освобождать отдельными операциями или освобождать память с другого адреса.

Размер оперативной памяти доступной, для динамического выделения, зависит от конфигурации используемого компьютера и возможностей операционной системы. Например, возможности операционной системы DOS ограничены 64Кбайтами при использовании короткой (2-х байтовой near) адресации и 1Мбайтом при использовании длинных (4-х байтовых far, huge) адресов. Для использования больших адресов необходимо использовать специальное программное и аппаратное обеспечение. Это связано с механизмом трактовки адресов с помощью сегментов и смещений. В других, более современных операционных системах эти ограничения связаны с архитектурой используемых процессоров.

Имеется несколько функций для работы с динамической памятью, которые можно использовать в разных операционных системах, но они могут иметь свои специфичные особенности при выполнении.

Функция int coreleft () возвращает беззнаковое целое число - размер доступной памяти для выделения в байтах.

Функция char * malloc (long int) пытается выделить требуемое количество памяти и возвращает адрес начала участка. Если памяти недостаточно, то возвращает пустой адрес.

Функция void free (char *) освобождает ранее выделенный участок памяти и возвращает его в стек доступной памяти для дальнейшего использования.

Функции выделения памяти возвращают адрес в виде указателя на символьную строку и необходимо явно приводить этот адрес к нужному типу для исключения конфликтов при работе с этим адресом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]