Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.046 c
15-1445860992
DayGaykin
2015-10-26 15:03
2017.01.15
PHP и Java для Web


15-1456781401
Юрий
2016-03-01 00:30
2017.01.15
С днем рождения ! 1 марта 2016 вторник


2-1419009922
AlexeyTG
2014-12-19 20:25
2017.01.15
Заново переписал Просьба оценить "корявость кода" v2


2-1424288600
AndrewAndrey
2015-02-18 22:43
2017.01.15
Связь полей таблиц SQLite


15-1451943001
Юрий
2016-01-05 00:30
2017.01.15
С днем рождения ! 5 января 2016 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский