Talking about dynamic arrays I was just curious if we could us the new 
management operators to make dynamic arrays that are managed on the stack.

Here’s a quick demo I typed up but I don’t understand why the init/dealloc 
count isn’t balanced. Calling the constructor seems to be the culprit, but why? 
   

type
        generic TDynArray<T> = record
                private type TDynArrayTable = array[0..0] of T;
                private type TDynArrayTablePtr = ^TDynArrayTable;
                private
                        table: TDynArrayTablePtr;
                public
                        constructor Create (values: array of T);
                        procedure Push(value: T);
                        class operator Finalize(var a: TDynArray);
                        class operator Initialize(var a: TDynArray);
        end;

constructor TDynArray.Create (values: array of T);
var
        value: T;
begin
        for value in values do
                Push(value);
end;

class operator TDynArray.Initialize(var a: TDynArray);
begin
        writeln('init');
        a.table := nil;
end;

class operator TDynArray.Finalize(var a: TDynArray);
begin
        FreeMem(a.table);
        a.table := nil;
        writeln('dealloc');
end;

procedure TDynArray.Push(value: T);
begin
        if table = nil then
                table := GetMem(0);
        writeln('push ', value); // grow array etc...
end;

procedure TestDynArray;
type
        TIntArray = specialize TDynArray<Integer>;
var
        d: TIntArray;
begin
        d := TIntArray.Create([1, 2, 3]);
        d.Push(100);
end;

========

init
init
dealloc
push 1
push 2
push 3
push 100
dealloc
dealloc




Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to