{$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;
WriteLn('Zaalokowalem: ', Length(RefList), ' blokow');
End;
(* TFree.Destroy *)
Destructor TFree.Destroy;
Var P: Pointer;
Begin
For P in RefList Do
FreeMem(P);
WriteLn('Zwolnilem: ', Length(RefList), ' blokow');
inherited Destroy;
End;
{$MACRO ON}
{$DEFINE AllocMem:=(TFree.Create as IFree).Allocate}
(* MyProc *)
Procedure MyProc;
Var Data: PByte;
I : uint16;
Data2: PByte;
Begin
Data := AllocMem(10);
Data2 := AllocMem(20);
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.
eyRNT0RFIE9CSkZQQ30KVXNlcyBIZWFwVHJjOwoKVHlwZSBJRnJlZSA9CiAgICAgSW50ZXJmYWNlWyd7NkJCNzVCMTUtMThBNy00MjRDLTg5RDItRkZBOThDOTEzNzg5fSddCiAgICAgIEZ1bmN0aW9uIEFsbG9jYXRlKGNvbnN0IFNpemU6IHVpbnQzMik6IFBvaW50ZXI7CiAgICAgRW5kOwoKVHlwZSBURnJlZSA9CiAgICAgQ2xhc3MoVEludGVyZmFjZWRPYmplY3QsIElGcmVlKQogICAgICBQcml2YXRlCiAgICAgICBSZWZMaXN0OiBBcnJheSBvZiBQb2ludGVyOwoKICAgICAgUHVibGljCiAgICAgICBGdW5jdGlvbiBBbGxvY2F0ZShjb25zdCBTaXplOiB1aW50MzIpOiBQb2ludGVyOwogICAgICAgRGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKICAgICAgRW5kOwoKKCogVEZyZWUuQWxsb2NhdGUgKikKRnVuY3Rpb24gVEZyZWUuQWxsb2NhdGUoY29uc3QgU2l6ZTogdWludDMyKTogUG9pbnRlcjsKQmVnaW4KIFJlc3VsdCA6PSBBbGxvY01lbShTaXplKTsKCiBTZXRMZW5ndGgoUmVmTGlzdCwgTGVuZ3RoKFJlZkxpc3QpKzEpOwogUmVmTGlzdFtIaWdoKFJlZkxpc3QpXSA6PSBSZXN1bHQ7CiBXcml0ZUxuKCdaYWFsb2tvd2FsZW06ICcsIExlbmd0aChSZWZMaXN0KSwgJyBibG9rb3cnKTsKRW5kOwoKKCogVEZyZWUuRGVzdHJveSAqKQpEZXN0cnVjdG9yIFRGcmVlLkRlc3Ryb3k7ClZhciBQOiBQb2ludGVyOwpCZWdpbgogRm9yIFAgaW4gUmVmTGlzdCBEbwogIEZyZWVNZW0oUCk7CgogV3JpdGVMbignWndvbG5pbGVtOiAnLCBMZW5ndGgoUmVmTGlzdCksICcgYmxva293Jyk7CiBpbmhlcml0ZWQgRGVzdHJveTsKRW5kOwoKeyRNQUNSTyBPTn0KeyRERUZJTkUgQWxsb2NNZW06PShURnJlZS5DcmVhdGUgYXMgSUZyZWUpLkFsbG9jYXRlfQoKKCogTXlQcm9jICopClByb2NlZHVyZSBNeVByb2M7ClZhciBEYXRhOiBQQnl0ZTsKICAgIEkgICA6IHVpbnQxNjsKICAgIERhdGEyOiBQQnl0ZTsKQmVnaW4KIERhdGEgOj0gQWxsb2NNZW0oMTApOwoKIERhdGEyIDo9IEFsbG9jTWVtKDIwKTsKCiBGb3IgSSA6PSAwIFRvIDkgRG8KICBEYXRhW0ldIDo9IFJhbmRvbShIaWdoKEJ5dGUpKTsKCiBGb3IgSSA6PSAwIFRvIDkgRG8KICBXcml0ZShEYXRhW0ldLCAnICcpOwoKIFdyaXRlbG47CiAKIApFbmQ7CgpCZWdpbgogTXlQcm9jOwoKIFdyaXRlbG4oJy0tIGVuZCAtLScpOwogUmVhZGxuOwpFbmQuCg==