Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.01.15;
Скачать: CL | DM;

Вниз

Утечка?   Найти похожие ветки 

 
Цукор5   (2015-05-20 15:03) [0]

Будет ли утечка памяти 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;


Спасибо


 
MBo ©   (2015-05-20 15:29) [1]

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


 
Юрий Зотов ©   (2015-05-20 16:45) [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;


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


 
Rouse_ ©   (2015-05-20 18:32) [3]

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



Страницы: 1 вся ветка

Текущий архив: 2017.01.15;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.021 c
15-1454505647
кгшзх
2016-02-03 16:20
2017.01.15
ПДД баттл


15-1451560078
Kerk
2015-12-31 14:07
2017.01.15
С новым годом!


6-1282190766
avkit
2010-08-19 08:06
2017.01.15
hyperterminal


15-1448473849
RusSun
2015-11-25 20:50
2017.01.15
Хулиганы добавили offtop сообщения в KOL конференции


3-1311683275
Patrick1968
2011-07-26 16:27
2017.01.15
Интересная вещь в ADO