Du arbeitest bei Objekten immer mit Pointern. Du gibst also nur die Adresse des Objektes zurück. Wenn das dann zerstört ist, kannst du damit auch nichts mehr anfangen.
Deshalb gibt man auch keine Objekte zurück. Erstellung und Freigabe eines Objekts sollten immer spiegelverkehrt an der gleichen Stelle passieren. (oben in einer Methode - weiter unten in der gleichen Methode, Konstruktor - Destruktor, ...)
Hier geht das dann so:
Delphi-Quellcode:
procedure FillMyList(const AList: TStrings);
begin
AList.Add('A');
AList.Add('B');
end;
// Verwendung:
var
Test: TStringList;
begin
Test := TStringList.Create;
try
FillMyList(AList);
ShowMessage(AList[0]);
finally
Test.Free;
end;
end;