Страница 1 из 1

Поле класса типа TStringList

СообщениеДобавлено: 22.11.2010 21:21:04
HJS
Всем доброго времени суток. Я сравнительно недавно начал изучать программирование и у меня возник вопрос при написании собственного класса: имеется класс, например, TMyClass = class(TObject), одно из полей которого имеет тип TStringList (res:TStringList). Теперь непосредственно вопрос - после того как я отработал с переменной типа TMyClass (st:TMyClass) необходимо ли освобождать память для поля res (res.Free) или вполне достаточно st.Free?

Re: Поле класса типа TStringList

СообщениеДобавлено: 22.11.2010 22:08:31
Odyssey
Память для полей класса, как правило, выделяется в конструкторе класса и освобождается в деструкторе:
Код: Выделить всё
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). Для объяснения см. эту статью.

Re: Поле класса типа TStringList

СообщениеДобавлено: 22.11.2010 22:15:28
stikriz
Не совсем понятно о чем Вы.
Поле типа 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.

Re: Поле класса типа TStringList

СообщениеДобавлено: 23.11.2010 10:40:55
HJS
спасибо за разъяснения и ссылку. Век живи - век учись. Действительно, всё встало на свои места. :D