Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#22

AW: dynamische Array kopieren (letztes Element fehlt)

  Alt 25. Sep 2018, 18:58
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);
$2B or not $2B

Geändert von himitsu (25. Sep 2018 um 19:01 Uhr)
  Mit Zitat antworten Zitat