Установка размеров динамической памяти.
Создание и удаление динамических переменных.
Основные действия над динамическими переменными - создание и уничтожение - реализуется в языке Pascal стандартными процедурами New и Dispose.
Процедура New предназначена для создания динамических переменных определенного типа или, что тоже самое, отведение памяти в куче для хранения динамической переменной. Единственным параметром New является переменная ссылочного типа:
- в динамической области памяти отводится место для хранения переменной, тип которой совпадает с базовым типом указателя – параметра;
- переменной, переданной в параметре присваивается указатель на определенную область памяти.
var
p : ^Person;
begin
New (p);
…
Приведет к отведению в куче области памяти, достаточной для хранения записи типа Person, и присваиванию указателя на эту область переменной p. Доступ возможен только через указатель!
P^.Name := 'Иван';
P^.Sex := male;
….
Если при выполнении New размещение новой переменной в куче не хватает памяти, то значение указателя, переданного в параметре, не изменится. При этом выполнение программы не прекращается и никаких сообщений выдано не будет, поэтому в дальнейшем работать с указателем нельзя. Для избежания этой ситуации следует проверять текущее состояние динамической памяти перед каждым обращением к New. Это можно сделать с помощью стандартной функции MaAvail, которая возвращает максимальный размер непрерывного участка свободной памяти.
Если необходимо создать динамическую переменную типа Longint:
Var
Pl: ^Longint;
Begin
If MaxAvail>=4 then
New(pl)
Else
Writeln('исчерпана динамическая память');
…..
В общем случае для определения размера необходимой памяти можно воспользоваться стандартной функцией size of.
If MaxAvail >= size of(Person) then
P:=new(person);
….
Кроме того в языке имеется функция MemAvail, которая в отличие от MaxAvail определяющую наибольшую свободную непрерывную область, определяет общий объем свободных областей.
Для освобождения памяти используется процедура Dispose. Параметр должен совпадать с базовым типом процедуры и быть ранее объявленным new.
Var
P: ^Person;
Begin
New(p);
(Действия с указателем P)
dispose(p);
end.
Иногда при работе с динамическими переменными возникает проблема потерянных ссылок.
Program Ssylka;
Type
Pperson = ^ person
Person = record
….
End;
Procedure GetPerson;
Var
P: Pperson;
Begin
P:=new(Pperson);
End;
…
Begin
Writeln(MemAvail);
GetPerson;
Writeln(MemAvail);
End.
По умолчанию для кучи отводится весь объем наличной оперативной памяти, допустимой операционной системе, за вычетом памяти для кода программы и статических переменных. Размер динамической памяти может достигать 400k и более. Но в некоторых случаях этого не нужно.
Для управления размерами динамической памяти используется директива $M. Эта директива должна располагаться в начале текста программы и имеет три целочисленных параметра, которые должны разделяться запятыми. Первый параметр определяет максимальный размер памяти, выделяемой под стек локальных переменных, а два следующих параметра задают минимальный и максимальный размеры динамической памяти. Второй носит ограничительный характер и устанавливает тот объем памяти, без которого программа работать не будет. Третий параметр носит рекомендательный характер.
{$ M 10240, 0, 200000}
{$M 16384. 1024, 650000}