GetMem x ReallocMem

What is the difference between System.GetMem and System.ReallocMem?

The Delphi 2009 Help for ReallocMem is exactly the same GetMem description. What about System.FreeMem and System.Dispose

What should be used with arrays?

type
  PMemberDataList = ^TMemberDataList;
  TMemberDataList = array[0..MaxClassMembers -1] of PMemberData;

var
  FItems: PMemberDataList;

begin
  GetMem(FItems, Value * SizeOf(Pointer));
  FreeMem(FItems);
end;

or

begin
  ReallocMem(FItems, Value * SizeOf(Pointer));
  Dispose(FItems);
end;

Decision

After consulting with people, I declared FItems as a record type, not a pointer to a record, TMemberDataList as a dynamic array, SetLength in (de) alloc array, New / Dispose to data p>

type
  PMemberDataList = ^TMemberDataList;
  TMemberDataList = array of PMemberData;
var
  Items: TMemberDataList;
  Item: PMemberData;

// Add
begin
  Setlength(Items, 1);
  New(Item);
  Items[0]:= Item
end;

// Remove
begin
  Dispose(Items[0]);
  Setlength(Items, 0);
end;
+5
source share
2 answers

GetMem , FreeMem / , ReallocMem , , . , ReAllocMem - API . nil ReAllocMem > 0, GetMem. ReAllocMem size = 0, FreeMem. , "" , - nil p > 0.

New Dispose " ", Turbo Pascal ( "" ). New Dispose , , . , :

type
  PMyRec = ^TMyRec;
  TMyRec = record
    Name: string;
    Value: Variant;
  end;

var
  Rec: PMyRec;
begin
  New(Rec);
  try
    Rec.Name := 'TestValue';
    Rec.Value := 100;
    ...
  finally
    Dispose(Rec);
  end;
end;

New Dispose , Name Value . New Dispose, :

GetMem(Rec, SizeOf(Rec^));
Initialize(Rec);
...
Finalize(Rec);
FreeMem(Rec);

, , Gamecat , , , , , . , , , . , . , :

var
  Member: TMemberData;
  Items: array of TMemberData;
  ...
begin
  SetLength(Items, Value);
  for Member in Items do  // iterate over each element in the array
  ...
  for Low(Items) to High(Items) do // same as above only using std functions
  ...
end;

, , , , , , TMemberData , , "" , .

+20

GetMem . ReallocMem .

:

var
  FItems : array of TMemberDataList;

begin
  SetLength(FItems, Value);
end;

Delphi.

:

type
  TMemberDataList = array[0..MaxClassMembers -1] of TMemberData;

var
  FItems: TMemberDataList;
begin
  // Don't need to allocate FItems
end;

:

type
  TMemberDataList = array of TMemberData;

var
  FItems: TMemberDataList;
begin
  SetLength(FItems, MaxClassMembers);
end;

- . , , TP. - , .

+3

All Articles