Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Утечка? [D7]


Цукор5 ©   (2015-05-20 15:03:00) 

Будет ли утечка памяти TObjectList? Как правильно освобождать и работать с TObjectList при передаче другим процедурам/функциям?


procedure TForm1.Button1Click(Sender: TObject);
 var Obj:TObjectList;
 I:Integer;
begin
  Obj:=TObjectList.Create;
  for I:=0 to 4 do Obj.Add(TStringList.Create);
  for I:=0 to 9 do
  begin
    TStrings(Obj.Items[0]).Add('000');
    TStrings(Obj.Items[1]).Add('111');
    TStrings(Obj.Items[2]).Add('222');
    TStrings(Obj.Items[3]).Add('333');
    TStrings(Obj.Items[4]).Add('444');
  end;
  Call( Obj);
end;

procedure TForm1.Call(hList: TObjectList);
 var List:TObjectList;
 I:Integer;
begin
  List:=TObjectList(hList);
  try
    for I:=0 to TStrings(List.Items[0]).Count-1 do
    begin
      Memo1.Lines.Add( TStrings(List.Items[0]).Strings[I]);
      Memo1.Lines.Add( TStrings(List.Items[1]).Strings[I]);
      Memo1.Lines.Add( TStrings(List.Items[2]).Strings[I]);
      Memo1.Lines.Add( TStrings(List.Items[3]).Strings[I]);
      Memo1.Lines.Add( TStrings(List.Items[4]).Strings[I]);
    end;
  finally
    List.Free;
  end;
end;


Спасибо


Rouse_   (2015-05-20 18:32:00) [1]

Если именно в D7 и с учетом [2] - не будет (если не учитывать, что код страшен).
Но не всегда параметр TObjectList.OwnsObjects будет выставлен по умолчанию в True, ибо кроме D7 есть и другие инструментарии.


Юрий Зотов   (2015-05-20 16:45:00) [2]

> Цукор5   (20.05.15 15:03)

> Будет ли утечка памяти TObjectList?

> Как правильно освобождать и работать с TObjectList
> при передаче другим процедурам/функциям?


Утечка будет, если на участке программы ДО вызова Call возникнет исключительная ситуация:

procedure TForm1.Button1Click(Sender: TObject);
var
 Obj:TObjectList;
begin
 Obj:=TObjectList.Create;
 // Если здесь возникнет исключительная ситуация,
 // то Call не вызовется и Obj повиснет в памяти - утечка!
 Call(Obj);
end;


Общее правило такое: в каком методе/процедуре/функции объект создан, там он и должен быть уничтожен причем, гарантированно:

procedure TForm1.Button1Click(Sender: TObject);
var
 Obj:TObjectList;
begin
 Obj:=TObjectList.Create;
 try
   ...
 finally
   Obj.Free
 end
end;


Из этого правила бывают исключения (когда этого требует алогоритм), но их лучше избегать. Причем необходимость в таком исключении обычно свидетельствует о том, что структура кода продумана плохо.


MBo   (2015-05-20 15:29:00) [3]

Лучше выделять и освобождать в одном месте, тогда и легко всё после TObjectList.Create обернуть в try-finally


Наверх

Титульная страница Поиск, карта сайта Написать письмо