Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

как правильно очистить 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.142 c
2-1345811633
Егорка
2012-08-24 16:33
2013.03.22
Безопасен ли вызов в DllMain такой функции


15-1339360203
Юрий
2012-06-11 00:30
2013.03.22
С днем рождения ! 11 июня 2012 понедельник


2-1343722792
Теркин
2012-07-31 12:19
2013.03.22
Сбой работы базы данных


4-1260947297
zvm
2009-12-16 10:08
2013.03.22
чтение конкретного LBA на винте


2-1334063803
AndreyPl
2012-04-10 17:16
2013.03.22
комбинация клавиш для установки TabOrder