program Project490;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
function StringRefCount(
const Value:
string): Integer;
var
P: PInteger;
begin
P := @Value[1];
Dec(P, 2);
Result := P^;
end;
procedure Main;
var
arr: TArray<
string>;
I: Integer;
begin
SetLength(arr, 10);
for I := 0
to 8
do begin
arr[I] := I.ToString;
end;
arr[9] := arr[8];
Writeln('
Verwendung von Move und SetLength');
Writeln('
8 und 9 zeigen auf denselben string, RefCount ist OK');
Writeln('
7: ', StringRefCount(arr[7]));
Writeln('
8: ', StringRefCount(arr[8]));
Writeln('
9: ', StringRefCount(arr[9]));
Move(arr[1], arr[0], 9*SizeOf(arr[0]));
Writeln('
nach Move: 7,8 und 9 zeigen auf denselben string, aber RefCount is 2!');
Writeln('
7: ', StringRefCount(arr[7]));
Writeln('
8: ', StringRefCount(arr[8]));
Writeln('
9: ', StringRefCount(arr[9]));
SetLength(arr, 9);
Writeln('
nach SetLength: RefCount für 9 wird runtergezählt.');
Writeln('
7 und 8 zeigen auf denselben string, aber RefCount ist 1!');
Writeln('
7: ', StringRefCount(arr[7]));
Writeln('
8: ', StringRefCount(arr[8]));
arr[8] := '
';
Writeln('
8 ist jetzt leer, RefCount wurde erniedrigt.');
Writeln('
7 zeigt immer noch auf diesen string, aber RefCount ist 0!');
Writeln('
7: ', StringRefCount(arr[7]));
Writeln('
8: ', StringRefCount(arr[8]));
Writeln;
end;
procedure Main2;
var
arr: TArray<
string>;
I: Integer;
begin
SetLength(arr, 10);
for I := 0
to 8
do begin
arr[I] := I.ToString;
end;
arr[9] := arr[8];
Writeln('
Verwendung von Delete');
Writeln('
8 und 9 zeigen auf denselben string, RefCount ist OK');
Writeln('
7: ', StringRefCount(arr[7]));
Writeln('
8: ', StringRefCount(arr[8]));
Writeln('
9: ', StringRefCount(arr[9]));
Delete(arr, 0, 1);
Writeln('
nach Delete: RefCount für 9 wird runtergezählt.');
Writeln('
7 und 8 zeigen auf denselben string, RefCount ist OK');
Writeln('
7: ', StringRefCount(arr[7]));
Writeln('
8: ', StringRefCount(arr[8]));
arr[8] := '
';
Writeln('
8 ist jetzt leer, RefCount wurde erniedrigt.');
Writeln('
7 zeigt immer noch auf diesen string, RefCount ist OK');
Writeln('
7: ', StringRefCount(arr[7]));
Writeln('
8: ', StringRefCount(arr[8]));
Writeln;
end;
begin
try
Main;
Main2;
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
Readln;
end.