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.