Ihr müsst bei "ohne var" das SetLength weglassen,
denn Dieses behandelt ordnungsgemäß die Referenzzählung und macht vor dem nachfolgenden Schreibzugriff die lokale "Kopie" unique.
Mit "const" würde die Referenz nicht hochgezählt, was bei SetLength dann durchrutschen würde (wenn vor Funktionsaufruf nur eine Referenz existierte), aber da SetLength bei einer Kostante vom Compiler verweigert wird, gibt es dieses Problem dort nicht.
Grund: außer bei LongStrings funktioniert für keine dynamischen Array die Referenzprüfung, wenn auf Felder schreibend zugegriffen wird.
CopyOnWrite ist da nur für LongStrings (String, AnsiString, UnicodeString usw.) implementiert und fehlt seit Jahrzehnten.
PS:
A2 := A1;
und übergabe an Parameter/Property erhöht nur den Referenzzähler.
A2 := Copy(A2);
, SetLength oder die UniqueXyz-Funktionen aus der System-Unit sollte man also vor Schreibzugriffen immer manuell aufrufen, wenn man mit "externen" Arrays arbeitet und deren Inhalt nicht veränder darf.
PSS: Noch ein Beispiel, dass auch LongStrings nicht von Problemen verschont werden.
Delphi-Quellcode:
function MeineFunktion: string;
begin
Result := Result + 'X';
end;
S := '';
for i := 1 to 10 do
S := MeineFunktion;
ShowMessage(S);