Память для полей класса, как правило, выделяется в конструкторе класса и освобождается в деструкторе:
- Код: Выделить всё
constructor TMyClass.Create;
begin
inherited Create;
res := TStringList.Create;
end;
destructor TMyClass.Destroy; override;
begin
res.Free;
inherited Destroy;
end;
Тогда при вызове st.Free освобождение памяти res произойдёт автоматически. Если же StringList создаётся извне класса, то и освобождать придётся тоже извне, но так обычно не поступают.
Кстати, лучше вместо st.Free и res.Free использовать FreeAndNil(st) и FreeAndNil(res). Для объяснения см.
эту статью.