Ich vermute mal der entscheidende Teil deines Codes fehlt in deinem Beispiel. Was machst du mit dem Files Array? Gibst du das sauber frei?
SetLength(Files, 0); // keine Auswirkung
Es wird auf den Copy befehl verzweigt.
Auch wenn ich den String selber splite.
Result[spCount - 1] := Copy(sTemp, 1, spPos - 1); // der leak soll hier entstehen
Das ist der letzte Aufruf in System
function _UStrCopy(const S: UnicodeString; Index, Count: Integer): UnicodeString;