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

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

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

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

Сообщение HJS » 22.11.2010 21:21:04

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

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

Сообщение Odyssey » 22.11.2010 22:08:31

Память для полей класса, как правило, выделяется в конструкторе класса и освобождается в деструкторе:
Код: Выделить всё
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). Для объяснения см. эту статью.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

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

Сообщение stikriz » 22.11.2010 22:15:28

Не совсем понятно о чем Вы.
Поле типа 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.
Аватара пользователя
stikriz
энтузиаст
 
Сообщения: 612
Зарегистрирован: 15.03.2006 09:37:47

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

Сообщение HJS » 23.11.2010 10:40:55

спасибо за разъяснения и ссылку. Век живи - век учись. Действительно, всё встало на свои места. :D
HJS
незнакомец
 
Сообщения: 4
Зарегистрирован: 19.01.2010 19:31:38


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru