// Huge Strings
haben neben einem Längenzähler auch einen Referenzzähler.
// Wenn ein String einer Prozedur übergeben wird, ohne
const,
var
oder
out
// zu verwenden, wird ein Duplikat des Strings erzeugt, welches
gesondert
// bearbeitet werden kann. Dabei wird der Referenzzähler inkrementiert.
// Das gleiche passiert beispielsweise auch, wenn ein Zeichen des
Strings
// verändert wird. Wird ein Duplikat eines Strings einem anderen String
// zugewiesen, wird der Referenzzähler wieder um 1 vermindert. Solange
kein
// Duplikat des Strings besteht, hat der Zähler den Wert -1.
// Die folgende kleine Funktion kann den Referenzzähler eines Strings
auslesen.
// Getestet mit D4 unter XP
function Referenz(const s: string): Longint; // bis Delphi 7
var
p: ^Longint;
begin
if s = '' then result := 0
else begin
p := @Pchar(s)^;
dec(p, 2);
result := p^;
end;
end;
// --- Demo ---
procedure stringtest_const(const s: string);
begin
showmessage('const - ' + s + #13 + inttostr(Referenz(s)));
end;
procedure stringtest_einfach(s: string);
begin
showmessage('ohne - ' + s + #13 + inttostr(Referenz(s)));
end;
procedure TForm1.Button5Click(Sender: TObject);
var
s, zweiterString: string;
begin
zweiterString := 'Versuch';
s := 'Test';
showmessage(s + #13 + inttostr(Referenz(s))); // -1
s := 'Fest';
showmessage(s + #13 + inttostr(Referenz(s))); // -1
s[2] := 'a';
showmessage(s + #13 + inttostr(Referenz(s))); // wird 1
stringtest_const(s); // bleibt 1
stringtest_einfach(s); // wird 2
zweiterString[1] := s[1];
showmessage(s + #13 + inttostr(Referenz(s))); // wird wieder 1
s := '';
showmessage(s + #13 + inttostr(Referenz(s))); // 0
end;
|