Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.015 c
11-1264591062
Bob
2010-01-27 14:17
2017.01.15
Ошибка при инстале KOL и MCK v2.88


15-1449842599
Fox
2015-12-11 17:03
2017.01.15
Приложение под Андроид на Java


2-1419657072
SKIPtr
2014-12-27 08:11
2017.01.15
получение времени из DateTimePicker


2-1423343139
Andrey K
2015-02-08 00:05
2017.01.15
Как перевести текст в формат DOS


15-1455053404
Юрий
2016-02-10 00:30
2017.01.15
С днем рождения ! 10 февраля 2016 среда




   Наверх