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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
HJS
незнакомец
Сообщения: 4
Зарегистрирован: 19.01.2010 18:31:38

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

Сообщение HJS »

Всем доброго времени суток. Я сравнительно недавно начал изучать программирование и у меня возник вопрос при написании собственного класса: имеется класс, например, TMyClass = class(TObject), одно из полей которого имеет тип TStringList (res:TStringList). Теперь непосредственно вопрос - после того как я отработал с переменной типа TMyClass (st:TMyClass) необходимо ли освобождать память для поля res (res.Free) или вполне достаточно st.Free?
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение 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). Для объяснения см. эту статью.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение 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.
HJS
незнакомец
Сообщения: 4
Зарегистрирован: 19.01.2010 18:31:38

Сообщение HJS »

спасибо за разъяснения и ссылку. Век живи - век учись. Действительно, всё встало на свои места. :D
Ответить