Главная страница
    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.048 c
2-1420390534
Ghost del vonte
2015-01-04 19:55
2017.01.15
OCX


15-1452597638
GanibalLector
2016-01-12 14:20
2017.01.15
PDF


15-1455112976
K-1000
2016-02-10 17:02
2017.01.15
Canvas. Вывести зеркальное изображение с альфой?


15-1450878108
RWolf
2015-12-23 16:41
2017.01.15
ToolButton для выбора цвета шрифта


15-1449178204
Юрий
2015-12-04 00:30
2017.01.15
С днем рождения ! 4 декабря 2015 пятница





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский