Установка размеров динамической памяти

Создание и удаление динамических переменных.

Основные действия над динамическими переменными - создание и уничтожение - реализуется в языке 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}



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: