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

Материал из DRKB

Динамическое распределение памяти[править | править код]

uses WinCRT;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyArray: array[0..30] of char;
  b: ^char;
  i: integer;
begin
  StrCopy(MyArray, 'Delphi World - это круто!!!');
  b := @MyArray;
  for i := StrLen(MyArray) downto 0 do
  begin
    write(b^);
    inc(b, sizeof(char));
  end;
end;


Source: http://delphiworld.narod.ru
ID: 00812



Как мне уменьшить количество занимаемой мной памяти в сегменте данных? (или как мне распределять память динамически?)

Скажем, ваша структура данных выглядит похожей на эту:


type
  TMyStructure = record
    Name: String[40];
    Data: array[0..4095] of Integer;
end;

Она слишком большая для глобального распределения, так что вместо объявления глобальной переменной,

var
  MyData: TMyStructure;

объявляете указательный тип,

type
  PMyStructure = ^TMyStructure;

и переменную этого типа,

var
  MyDataPtr: PMyStructure;

Такой указатель занимает всего лишь четыре байта сегмента данных.

Прежде, чем вы сможете использовать структуру данных, вы должны распределить ее в куче:

New(MyDataPtr);

и получить к ней доступ через глобальные данные любым удобным для вас способом. Единственное отличие от традиционного способа заключается в необходимости использования символа "^" для обозначения указателя на данные:


MyDataPtr^.Name := 'Советы по Delphi';
MyDataPtr^.Data[0] := 12345;

И, наконец, после использования памяти, освободите ее:

Dispose(MyDataPtr);

Примечание от Vit: статья актуальна в основном для 16 разрядных систем


Source: http://delphiworld.narod.ru
ID: 00813