- •1. Языки, грамматики и их классификация. Примеры контекстно-свободных грамматик.
- •2 Трансляция арифметических выражений.
- •3 Классы. Свойства и методы, защита элементов классов. Создание и уничтожение объектов.
- •4 Управление динамической памятью
- •5 Технология создания программ и комплексов. Визуальное программирование.
- •6 Препроцессор и его основные возможности.
- •7 Адреса, указатели, ссылки. Адресная арифметика.
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 *) освобождает ранее выделенный участок памяти и возвращает его в стек доступной памяти для дальнейшего использования.
Функции выделения памяти возвращают адрес в виде указателя на символьную строку и необходимо явно приводить этот адрес к нужному типу для исключения конфликтов при работе с этим адресом.
