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; |
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:
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).
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; 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. |
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