Поле класса типа TStringList
Модератор: Модераторы
Поле класса типа TStringList
Всем доброго времени суток. Я сравнительно недавно начал изучать программирование и у меня возник вопрос при написании собственного класса: имеется класс, например, TMyClass = class(TObject), одно из полей которого имеет тип TStringList (res:TStringList). Теперь непосредственно вопрос - после того как я отработал с переменной типа TMyClass (st:TMyClass) необходимо ли освобождать память для поля res (res.Free) или вполне достаточно st.Free?
Память для полей класса, как правило, выделяется в конструкторе класса и освобождается в деструкторе:
Тогда при вызове st.Free освобождение памяти res произойдёт автоматически. Если же StringList создаётся извне класса, то и освобождать придётся тоже извне, но так обычно не поступают.
Кстати, лучше вместо st.Free и res.Free использовать FreeAndNil(st) и FreeAndNil(res). Для объяснения см. эту статью.
Код: Выделить всё
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). Для объяснения см. эту статью.
Не совсем понятно о чем Вы.
Поле типа TStringList у класса должно инициализироваться в конструкторе и убиваться в деструкторе.
Лучше этому полю дать в соответствие свойство типа TStrings с методами:
read и write.
function ReadMyStringList: TStrings;
begin
Result:=FMyStringList;
end;
procedure WriteMyStringList(const AStrings: TStrings);
begin
FMyStringList.Assign(AStrings);
end;
И тогда станет совершенно очевидно, что если Вы из какого-то кода делаете
st.Assign(MyClass.MyStringList);
То
st:=TStringList.Create;
надоделать
и
st.Free;
в конце надо делать.
Посмотрите как реализован, например, TMemo и далее - TCustomMemo, и все станет ясно - там свойство Lines - это Ваш случай.
Файл - custommemo.inc - там реализация TCustomMemo. Файл StdCtrls - объявление TMemo.
Поле типа TStringList у класса должно инициализироваться в конструкторе и убиваться в деструкторе.
Лучше этому полю дать в соответствие свойство типа TStrings с методами:
read и write.
function ReadMyStringList: TStrings;
begin
Result:=FMyStringList;
end;
procedure WriteMyStringList(const AStrings: TStrings);
begin
FMyStringList.Assign(AStrings);
end;
И тогда станет совершенно очевидно, что если Вы из какого-то кода делаете
st.Assign(MyClass.MyStringList);
То
st:=TStringList.Create;
надоделать
и
st.Free;
в конце надо делать.
Посмотрите как реализован, например, TMemo и далее - TCustomMemo, и все станет ясно - там свойство Lines - это Ваш случай.
Файл - custommemo.inc - там реализация TCustomMemo. Файл StdCtrls - объявление TMemo.
спасибо за разъяснения и ссылку. Век живи - век учись. Действительно, всё встало на свои места. 
