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.