Форум: "Начинающим";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
ВнизУтечка? Найти похожие ветки
← →
Цукор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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.067 c