Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Move und FillChar bei strings. (https://www.delphipraxis.net/180684-move-und-fillchar-bei-strings.html)

Bjoerk 9. Jun 2014 18:19

AW: Move und FillChar bei strings.
 
Ich hab mir jetzt TStrings/ TStringList doch mal näher angeschaut (ist strukturell sehr ähnlich TList (die kenne ich fast auswendig)). Schon erstaunlich daß man von einer Klasse ableitet die überhaupt keine Items hat? BTW, was ich auch nie verstehe warum man da nicht MaxListSize TStringItems erzeugt? (oder doch)?

Delphi-Quellcode:
  TStringList = class;

  PStringItem = ^TStringItem;
  TStringItem = record
    FString: string;
    FObject: TObject;
  end;

  PStringItemList = ^TStringItemList;
  TStringItemList = array[0..MaxListSize] of TStringItem;
  TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;

  TStringList = class(TStrings)
  private
    FList: PStringItemList;

Blup 10. Jun 2014 09:26

AW: Move und FillChar bei strings.
 
Bei Angabe eines ungültigen Index, darf sich die Liste überhaupt nicht verändern.
Das Fillchar muss die Stringvariable löschen, nicht den Inhalt des Strings.
Delphi-Quellcode:
procedure TMyStringList.Delete(const Index: integer);
begin
  if (Index < 0) or (Index >= FCount) then
    raise Exception.Create(...);

  Dec(FCount);
  Finalize(FItems[Index]);
  if Index < FCount then
    Move(FItems[Index + 1], FItems[Index], (FCount - Index) * SizeOf(string));

  FillChar(FItems[FCount], SizeOf(string), 0);
end;
Auch der Aufruf Finalize und die abschießende Zuweisung eines leeren Strings kann problematisch sein, wenn der Stringpointer vorher nicht auf nil gesetzt wird (FillChar).
Finalize verringert eigentlich nur den Referenzzähler des Strings auf den die Variable bisher verweist (string wird freigegeben bei RefCount = 0).
Wird aber danach der Variablen wieder ein Wert zugewiesen und die Variable zeigt noch auf den alten String, wird das erneut versucht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz