Динамическое распределение памяти в Delphi

Чтобы сэкономить вычислительные ресурсы, во многих языках программирования используется динамическое распределение памяти. Визуальная система Delphi не является исключением. Эффективность использования динамического распределения памяти достигается в тех случаях, когда в задаче число необходимых объектов зависит от от обрабатываемых данных, а также в том случае, когда это число заранее не известно.

Для выделения памяти динамически используется heap (куча). Следует всегда помнить то, что при выделении динамической памяти после ее использования следует освободить эту память.
Для демонстрации примеров создам новый проект в Delphi. Из проекта удалю Unit1.pas. А сам проект путем нажатия правой кнопкой мыши и выбора View Source рассмотрю исходный текст. Таким приемом создаются консольные программки, которые не требуют графического интерфейса в Delphi. Осталось удалить строки:
[code]
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.Run;
[/code]
и
[code]
uses
Forms;

{$R *.res}
[/code]
Добавлю {$APPTYPE CONSOLE}. Таким образом общий вид исходного текста выглядит следующим образом:
[code]
program Test1;

{$APPTYPE CONSOLE}

begin
Readln;
end.
[/code]
Существует два способа задания памяти в Delphi: New и GetMem. Освобождение памяти соответственно: Dispose и FreeMem.

Первый способ выделения динамической памяти

Процедура:
[code]
procedure New(<имя_указателя>);
[/code]
Пример:
[code]
program Test1;
{$APPTYPE CONSOLE}

Var P: ^Integer;
begin
New(P);
P^ := 5;
WriteLn(P^);
Dispose(P);

Readln;
end.
[/code]
На примере видно, что я освободил память в строке Dispose(P); , но само значение указателя остается. То есть память очистилась, а значение указателя осталось. В этом можно убедиться, если после строки Dispose(P); добавить строку WriteLn(P^); .

Второй способ выделения динамической памяти

Процедура:
[code]
procedure GetMem(<имя_указателя>, <объем в байтах>);
[/code]
Пример:
[code]
program Test1;
{$APPTYPE CONSOLE}

Var P: ^Integer;
begin
GetMem(P, SizeOf(Integer));
P^ := 5;
WriteLn(P^);
FreeMem(P, SizeOf(Integer));

WriteLn(P^);
Readln;
end.
[/code]
Главное отличие второго метода от первого это то, что во втором методе может быть использованы типизированные и нетипизированные указатели.

Заключение

При динамическом выделении памяти в Delphi может возникнуть исключение, которое возникнет при недостатке резерва памяти. При работе с динамической памятью следует всегда помнить то, что не следует смешивать оба способа выделения памяти. Например, освободить память путем FreeMem при выделении методом New.

1 Star2 Stars3 Stars4 Stars5 Stars (4 голосов, средний:5,00 из 5)
Вы можете пропустить чтение записи и оставить комментарий. Размещение ссылок запрещено.
Оставить комментарий