16,749
社区成员
发帖
与我相关
我的任务
分享
type TDynArr = array of Integer;
procedure foo1(a: array of Integer);
begin
Pointer((@a)^) := nil;
end;
procedure foo2(var a: array of Integer);
begin
Pointer((@a)^) := nil;
end;
procedure foo3(a: TDynArr);
begin
Pointer((@a)^) := nil;
end;
procedure foo4(var a: TDynArr);
begin
Pointer((@a)^) := nil;
end;
procedure bar;
var
a: TDynArr;
begin
SetLength(a, 1);
a[0] := 1;
foo1(a); // Length(a)=1, a[0]=1
foo2(a); // Length(a)=1, a[0]=0
a[0] := 1;
foo3(a); // Length(a)=1, a[0]=1
foo4(a); // a=nil
end;
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
FastMM4, SysUtils;
type
TDynArr = array of Integer;
function CreateDynArr(Len: Integer; InitVal: Integer): Pointer;
var
parr: PIntegerArray;
i: Integer;
begin
GetMem(parr, SizeOf(Integer)*(Len+2));
parr[0] := 1; // set the RefCnt to 1
parr[1] := Len; // set the Length to Len
for i:=2 to Len+1 do
parr[i] := InitVal; // initialize elements' value, set each to InitVal
Result := @parr[2]; // move its pointer to point at the end of array header
end;
procedure ShowArr(ArrPtr: Pointer);
var
parr: PIntegerArray;
i, len: Integer;
s: string;
begin
parr := ArrPtr;
i := 0;
len := parr[i-1]; // get the length
s := Format('Length: %d, RefCnt: %d', [len, parr[i-2]]); // get the reference count
Write(s, 'Elements = ');
s := Format('[%d', [parr[0]]); // get each value of the elements
for i:=1 to len-1 do
s := Format('%s, %d', [s, parr[i]]);
Writeln(s, ']');
end;
procedure ChangeDynArr(var X: TDynArr);
var
p: PPointer;
begin
X := nil; // decrease X's RefCnt, and release the dynamic array if RefCnt=0
p := @x;
p^ := CreateDynArr(5, 100);
end;
procedure main;
var
x: TDynArr;
p: Pointer;
px, pp: PPointer;
begin
SetLength(x, 2);
ShowArr(x);
p := x;
pp := @p;
px := @x;
Writeln(Format('[Pointer] size=%d, value=%p, addr=%p', [SizeOf(p), pp^, pp]));
Writeln(Format('[TDynArr] size=%d, value=%p, addr=%p', [SizeOf(x), px^, px]));
ChangeDynArr(x);
ShowArr(x);
Writeln(Format('[Pointer] size=%d, value=%p, addr=%p', [SizeOf(p), pp^, pp]));
Writeln(Format('[TDynArr] size=%d, value=%p, addr=%p', [SizeOf(x), px^, px]));
end;
begin
main;
Readln
end.