![]() |
AW: dynamische Array kopieren (letztes Element fehlt)
Weils hier öfters ein Problem war:
![]() |
AW: dynamische Array kopieren (letztes Element fehlt)
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:
Delphi-Quellcode:
und übergabe an Parameter/Property erhöht nur den Referenzzähler.
A2 := A1;
Delphi-Quellcode:
, 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.
A2 := Copy(A2);
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); |
AW: dynamische Array kopieren (letztes Element fehlt)
Bitte sagt mir ob ich das richtig verstanden habe!
Also wird tatsächlich immer eine Referenz auf ein DynArray übergeben. Abhängig von dem was ich danach mit der Referenz des Dnyarray mache wird unterschiedlicher Maschinencode erzeugt. Im
Code:
Fall, wird erst beim schreiben durch "Copy on Write" eine Arbeitskopie angelegt.
procedure KeyFooVal(arr: TStringDynArray)
Wenn ich nur lesend auf das Dynarray zugreife dann lese ich vom referenzierten Original? Das Schreiben auf Elementen des DynArray gilt nicht als Schreibenderzugriff auf das DynArray. "Copy on Write" erfolgt nicht. SetLength gilt als Schreiben auf das DynArray "copy on Write" erfolgt. Im
Code:
Fall, wird auch eine Referenz übergeben aber in keinem Fall erfolgt ein "Copy on write" wenn das DynArray bearbeitet wird.
procedure KeyFooRef(var arr: TStringDynArray);
>"This is madness!" |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz