Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

как правильно очистить TList ы, чтобы не было утечек памяти   Найти похожие ветки 

 
__QWERTY   (2012-05-04 14:28) [0]


var
 I: Integer;
 ListA, ListB: TList;
 SL: TStringList;
begin
 ListA := nil;
 ListB := nil;
 try
   ListA := TList.Create;
   ListB := TList.Create;

   SL := TStringList.Create;

   ListA.Add(SL);

   for I := 1 to 10 do
   begin
     SL := TStringList.Create;

     ListA.Add(SL);
     ListB.Add(SL);

   end;
 except
   ListA.Free;
   ListB.Free;
 end;
end;


 
Медвежонок Пятачок ©   (2012-05-04 14:32) [1]

а типа ты не знаешь


 
MsGuns ©   (2012-05-04 14:59) [2]

1)
ListA := nil;
ListB := nil;
И нафих не нужны

2) Вместо Except в данном случае нужен finally

3) а стиринглисты Пушкин с Байроном выгребут ?


 
MsGuns ©   (2012-05-04 15:01) [3]

Да и вообще в сабже бред написан, бессмыслица


 
MBo ©   (2012-05-04 15:41) [4]

for i := 0 to ListA.Count - 1 do
 TObject(ListA[i]).Free;

А вообще в данном случае проще TObjectList c OwnObjects использовать


 
icWasya ©   (2012-05-04 16:49) [5]

Но! Если делаете так
   SL := TStringList.Create;

    ListA.Add(SL);
    ListB.Add(SL);

то есть заносите один объект сразу в два списка - то вызывать деструктор(Free) нужно только один раз.


 
CRLF   (2012-05-04 16:54) [6]


> А вообще в данном случае проще TObjectList c OwnObjects
> использовать
Только рискуем нарваться на то, что в списке А объекты уже уничтожились, а в списке Б ссылки на них всё ещё живут.


 
MBo ©   (2012-05-04 17:36) [7]

Угу, не обратил внимания, что одни объекты в двух списках


 
Ega23 ©   (2012-05-04 17:55) [8]

Написать потомка TList, перекрыть ему Notify, там FreeAndNil дел

ааа, у него один и тот же объект.. Не получится. Либо третий ObjectList держать, в котором всё сидит, либо через интерфейсы разруливать


 
Cobalt ©   (2012-05-04 19:27) [9]

> MBo ©   (04.05.12 15:41) [4]
> for i := 0 to ListA.Count - 1 do
>  TObject(ListA[i]).Free;

+1


 
Rouse_ ©   (2012-05-04 20:48) [10]

после FreeAndNil нет смысла заботиться проверкой уничтожен объект или нет.
Free сам проверит на nil


 
Ega23 ©   (2012-05-04 21:41) [11]


> после FreeAndNil нет смысла заботиться проверкой уничтожен
> объект или нет.


Сань, он один и тот же объект в два разных листа добавляет. Ну FreeAndNil в первом, во втором-то указатель инвалидный остался...


 
Германн ©   (2012-05-04 22:13) [12]


> во втором-то указатель инвалидный остался...

FreeAndNil во втором тоже нормально отработает.


 
CRLF   (2012-05-04 22:30) [13]


> Германн ©   (04.05.12 22:13) [12]
Он-то отработает... Но если вместо FreeAndNil с оббъектами из второго списка попытаемся работать? Последствия непредсказуемые.


 
Германн ©   (2012-05-04 22:43) [14]


> Но если вместо FreeAndNil с оббъектами из второго списка
> попытаемся работать?

А это уже будет другой пример.


 
Ega23 ©   (2012-05-05 09:16) [15]


> FreeAndNil во втором тоже нормально отработает.


Да ну?


procedure TForm18.Button1Click(Sender: TObject);
var
 list1, list2: TList;
 sl: TStringList;
 i: Integer;
begin
 list1 := TList.Create;
 list2 := TList.Create;
 try
   sl := TStringList.Create;
   sl.Text := "sasorugoidfgpijp"#13#10"sdfjsoidfosiugfoiudbhsg";

   list1.Add(sl);
   list2.Add(sl);

   for i := 0 to list1.Count - 1 do
   begin
     sl := TStringList(list1[i]);
     FreeAndNil(sl);
   end;

   for i := 0 to list2.Count - 1 do
   begin
     sl := TStringList(list2[i]);
     FreeAndNil(sl);
   end;

 finally
   list2.Free;
   list1.Free;
 end;
end;


Invalid pointer operation, что вообще-та ожидаемо.


 
icWasya ©   (2012-05-05 09:47) [16]

Если нужно иметь именно такие списки, то есть несколько списков с произвольным добавлением/удалением, и нужно вести автоматический их учёт, то...
1) делать по технологии COM - объекты ведут учёт количества ссылок на них, и при обнулении количества ссылок автоматически вызывать деструктор.
2) делать по технологии компонент - при вызове деструктора объекта слать всем спискам уведомление, что объект уничтожился, и списки при этом должны удалить ссылку на уничтоженый объект.
3) вести полуавтоматический учёт - только один список является владельцем объектов, и при удалении из этого списка у объекта вызывается деструктор. А все остальные списки содержат только ссылки на объекты и не следят за временем их жизни. Естественно чистку первого списка делать только по окончании работы.


 
AV ©   (2012-05-05 11:41) [17]

а-ля так

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
 ListA := TList.Create;
 ListB := TList.Create;
 SL := TStringList.Create;
 ListA.Add(SL);
 for I := 1 to 2 do
 begin
  SL := TStringList.Create;
  ListA.Add(SL);
  ListB.Add(SL);
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 i: integer;

procedure AddStringListToListForKill(SL:Pointer);
var
  i: Integer;
  Uniq: Boolean;
begin
  Uniq := True;
  for i := 0 to ListC.Count - 1 do
  begin
    if Pointer(ListC.Items[i]) = SL then
    begin
      Uniq := False;
      Break;
    end;
  end;
  if Uniq then
    ListC.Add(TStringList(SL));
end;
procedure PrepareToFreeList(L: TList);
var
  i: Integer;
begin
  for i := 0 to L.Count - 1 do
  begin
    AddStringListToListForKill(Pointer(L.Items[i]));
  end;
end;
begin
 ListC := TList.Create;
 PrepareToFreeList(ListA);
 PrepareToFreeList(ListB);
 for i := 0 to ListC.Count - 1 do
 begin
   TStringList(ListC.Items[i]).Free;
 end;
end;


 
Давайте будем жрать!   (2012-05-05 12:12) [18]


> procedure AddStringListToListForKill(SL:Pointer);
Это зачем? Чем TList.IndexOf() не угодил?


> Pointer(L.Items[i])
А явное приведение типов зачем?


 
AV ©   (2012-05-05 12:21) [19]

>>Это зачем? Чем TList.IndexOf() не угодил?
>> А явное приведение типов зачем?
можно и IndexOf, можно и не приводить
Но мне так понятнее.


 
Давайте будем жрать!   (2012-05-05 12:28) [20]

Понятно :-)


 
MsGuns ©   (2012-05-07 10:47) [21]

Огурец написал от балды чушь и тут же все надели "мудрое выражение ица" и принялись советовать.
Кое-кто предложил даже интерфейс сваять. Угу, а сбоку еще ком-сервер и уракакл впридачу.

Как это все по-мастаковски :)


 
Inovet ©   (2012-05-07 15:07) [22]

> [21] MsGuns ©   (07.05.12 10:47)
> Как это все по-мастаковски :)

Как вычистить глистов, типа?:)


 
Давайте будем жрать!   (2012-05-07 17:01) [23]


> все надели "мудрое выражение ица" и принялись советовать

Дык «Начинающим» не для просвещения начинающих существует, а для куражу бывалых. %-)


 
Anatoly Podgoretsky ©   (2012-05-07 18:43) [24]


> MsGuns ©   (07.05.12 10:47) [21]

А веб сервер уже предлагали?



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

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.072 c
2-1345986998
Wadimka
2012-08-26 17:16
2013.03.22
Кто-нибудь работал с компонентом SecureBridg?


15-1353171765
plr
2012-11-17 21:02
2013.03.22
9 bit / бит четности


15-1337849446
Дмитрий С
2012-05-24 12:50
2013.03.22
Как правильно задать вопрос...


15-1341440157
Германн
2012-07-05 02:15
2013.03.22
Про современные холодильники.


15-1351061237
ixen
2012-10-24 10:47
2013.03.22
Среднее значение первых 100 строк





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