{$MODE OBJFPC}
Uses HeapTrc;
Type IFree =
Interface['{6BB75B15-18A7-424C-89D2-FFA98C913789}']
Function Allocate(const Size: uint32): Pointer;
End;
Type TFree =
Class(TInterfacedObject, IFree)
Private
RefList: Array of Pointer;
Public
Function Allocate(const Size: uint32): Pointer;
Destructor Destroy; override;
End;
(* TFree.Allocate *)
Function TFree.Allocate(const Size: uint32): Pointer;
Begin
Result := AllocMem(Size);
SetLength(RefList, Length(RefList)+1);
RefList[High(RefList)] := Result;
End;
(* TFree.Destroy *)
Destructor TFree.Destroy;
Var P: Pointer;
Begin
For P in RefList Do
FreeMem(P);
inherited Destroy;
End;
{$MACRO ON}
{$DEFINE AllocMem:=(TFree.Create as IFree).Allocate}
(* MyProc *)
Procedure MyProc;
Var Data: PByte;
I : uint16;
Begin
Data := AllocMem(10);
For I := 0 To 9 Do
Data[I] := Random(High(Byte));
For I := 0 To 9 Do
Write(Data[I], ' ');
Writeln;
End;
Begin
MyProc;
Writeln('-- end --');
Readln;
End.
eyRNT0RFIE9CSkZQQ30KVXNlcyBIZWFwVHJjOwoKVHlwZSBJRnJlZSA9CiAgICAgSW50ZXJmYWNlWyd7NkJCNzVCMTUtMThBNy00MjRDLTg5RDItRkZBOThDOTEzNzg5fSddCiAgICAgIEZ1bmN0aW9uIEFsbG9jYXRlKGNvbnN0IFNpemU6IHVpbnQzMik6IFBvaW50ZXI7CiAgICAgRW5kOwoKVHlwZSBURnJlZSA9CiAgICAgQ2xhc3MoVEludGVyZmFjZWRPYmplY3QsIElGcmVlKQogICAgICBQcml2YXRlCiAgICAgICBSZWZMaXN0OiBBcnJheSBvZiBQb2ludGVyOwoKICAgICAgUHVibGljCiAgICAgICBGdW5jdGlvbiBBbGxvY2F0ZShjb25zdCBTaXplOiB1aW50MzIpOiBQb2ludGVyOwogICAgICAgRGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKICAgICAgRW5kOwoKKCogVEZyZWUuQWxsb2NhdGUgKikKRnVuY3Rpb24gVEZyZWUuQWxsb2NhdGUoY29uc3QgU2l6ZTogdWludDMyKTogUG9pbnRlcjsKQmVnaW4KIFJlc3VsdCA6PSBBbGxvY01lbShTaXplKTsKCiBTZXRMZW5ndGgoUmVmTGlzdCwgTGVuZ3RoKFJlZkxpc3QpKzEpOwogUmVmTGlzdFtIaWdoKFJlZkxpc3QpXSA6PSBSZXN1bHQ7CkVuZDsKCigqIFRGcmVlLkRlc3Ryb3kgKikKRGVzdHJ1Y3RvciBURnJlZS5EZXN0cm95OwpWYXIgUDogUG9pbnRlcjsKQmVnaW4KIEZvciBQIGluIFJlZkxpc3QgRG8KICBGcmVlTWVtKFApOwoKIGluaGVyaXRlZCBEZXN0cm95OwpFbmQ7Cgp7JE1BQ1JPIE9OfQp7JERFRklORSBBbGxvY01lbTo9KFRGcmVlLkNyZWF0ZSBhcyBJRnJlZSkuQWxsb2NhdGV9CgooKiBNeVByb2MgKikKUHJvY2VkdXJlIE15UHJvYzsKVmFyIERhdGE6IFBCeXRlOwogICAgSSAgIDogdWludDE2OwpCZWdpbgogRGF0YSA6PSBBbGxvY01lbSgxMCk7CgogRm9yIEkgOj0gMCBUbyA5IERvCiAgRGF0YVtJXSA6PSBSYW5kb20oSGlnaChCeXRlKSk7CgogRm9yIEkgOj0gMCBUbyA5IERvCiAgV3JpdGUoRGF0YVtJXSwgJyAnKTsKCiBXcml0ZWxuOwpFbmQ7CgpCZWdpbgogTXlQcm9jOwoKIFdyaXRlbG4oJy0tIGVuZCAtLScpOwogUmVhZGxuOwpFbmQuCg==