Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: dynamisches arry "rückwärts" löschen

  Alt 24. Jun 2007, 00:44
Hallo,

bei der Verwendung von Move ist eine Warnung angebracht. Falls das Array dynamische Daten (Objektreferenzen, Interfaces, Ansi-/WideStrings) enthält, sind zusätzliche Schritte notwendig, um den Delphi-MemoryManager nicht zu verwirren. Die zu überschreibenden Elemente müssen vor dem Verschieben durch einen Aufruf von Delphi-Referenz durchsuchenFinalize finalisiert werden, Objekte sind freizugeben. Die freiwerdenden Elemente müssen mit NIL überschrieben werden, da sonst im Array mehrere Verweise auf einen Speicherbereich existieren.

Ein kleines Beispiel mit AnsiStrings:

Delphi-Quellcode:
var
  i : Integer;
  Texte : array of string;
begin
  // Array initialisieren
  SetLength (Texte, 10);
  for i := 0 to High(Texte) do
    Texte[i] := Format('Element #%d', [i]);
  // die zu überschreibenden Elemente finalisieren
  Finalize (Texte[0]); // alternativ: Zuweisung eines Leerstrings
  Finalize (Texte[1]);
  // Verschiebung durchführen
  Move (Texte[2], Texte[0], (Length(Texte) - 2) * SizeOf(Texte[0]));
  // freiwerdende Elemente mit NIL überschreiben
  Pointer(Texte[Length(Texte) - 2]) := nil;
  Pointer(Texte[Length(Texte) - 1]) := nil;
  // Array verkürzen
  SetLength (Texte, Length(Texte) - 2);
end;
Enthält das Array keine dynamischen Daten, ist der ganze Aufwand natürlich nicht notwendig.

Gruß Hawkeye
  Mit Zitat antworten Zitat